Git 的工作就是建立和儲存你項目的快照及與之後的快照進行對比
Git 與 SVN 差別
GIT不僅僅是個版本控制系統,它也是個内容管理系統(CMS),工作管理系統等。
如果你是一個具有使用SVN背景的人,你需要做一定的思想轉換,來适應GIT提供的一些概念和特征。
Git 與 SVN 差別點:
1、GIT是分布式的,SVN不是:這是GIT和其它非分布式的版本控制系統,例如SVN,CVS等,最核心的差別。
2、GIT把内容按中繼資料方式存儲,而SVN是按檔案:所有的資源控制系統都是把檔案的元資訊隐藏在一個類似.svn,.cvs等的檔案夾裡。
3、GIT分支和SVN的分支不同:分支在SVN中一點不特别,就是版本庫中的另外的一個目錄。
4、GIT沒有一個全局的版本号,而SVN有:目前為止這是跟SVN相比GIT缺少的最大的一個特征。
5、GIT的内容完整性要優于SVN:GIT的内容存儲使用的是SHA-1雜湊演算法。這能確定代碼内容的完整性,確定在遇到磁盤故障和網絡問題時降低對版本庫的破壞。
一般工作流程如下:
- 克隆 Git 資源作為工作目錄。
- 在克隆的資源上添加或修改檔案。
- 如果其他人修改了,你可以更新資源。
- 在送出前檢視修改。
- 送出修改。
- 在修改完成後,如果發現錯誤,可以撤回送出并再次修改并送出。

常用指令:
git add 暫存區的目錄樹被更新,将工作區的目錄寫入暫存區
git add . 添加目前項目的所有檔案
git add –i [path] 檢視這個目錄下所有修改和删除但沒有送出的檔案。執行這個指令
git commit –m ‘送出代碼并注釋’:将暫存區的目錄樹送出到版本庫中
git commit –am ‘第一次版本修改’:直接将工作區的代碼送出到版本庫
git remote 檢視目前遠端庫
git remote rm [别名] :删除遠端倉庫
git clone [url] 複制對應位址的倉庫下來
git remote –v 可以看到每個别名的實際連結位址
git pull 拉取最新的代碼,若有沖突,則修改沖突的檔案 ,不加參數的話 隻是針對目前分支與遠端自己分支進行同步更新
git push 拉最新代碼推到代碼倉庫。
git pull origin next:master :取回origin主機的next分支,與本地的master分支合并。
git push origin local_branch:remote_branch :将本地分支推送到遠端倉庫
git reset head:暫存區的目錄樹被版本庫中的代碼重寫,但是工作區不受影響
git reset --hard:将版本回退到上一次送出的版本
git rm –cached<file> 會直接從暫存區删除檔案,工作區則不做出改變
git rm file 會将檔案從緩存區和工作區删除
git reset --soft HEAD^ 送出從 commit 狀态退回到 add 狀态
git checkout--<file> 将暫存區的代碼寫入工作區(可能會誤删工作區未送出的代碼)
git checked HEAD:将版本庫中的所有代碼替代工作區的代碼,同時更新暫存區的代碼
touch:建立一個新的檔案
ls:顯示目前目錄下的所有檔案
git status –s:檢視項目的目前狀态
git diff 顯示你上次送出更新後的更改或者寫入緩存的改動
git config --global user.name '使用者名':設定使用者名
git config --global user.email 郵箱位址:設定郵箱
密鑰管理:
1、cd ~/.ssh 是否存在主目錄密鑰的目錄
2、ls 看下是否存在密鑰檔案
3、ssh-keygen -t rsa 生成密鑰
4、cat ~/.ssh/id_rsa.pub 檢視公鑰
5、添加公鑰到遠端倉庫
檔案的幾種狀态:
A:工作區中存在,送出到暫存區,且工作區和暫存區的代碼一緻
AM:檔案送出到暫存區後又有改動
AD:暫存區中有檔案,而工作區中沒有
??:代碼值存在工作區,未送出到暫存區
M:送出到版本庫後代碼仍然有改動、
分支管理:
建立分支:git branch (branchname)
切換分支:git checkout(branchname)
合并分支到目前分支上(在更新過程中也行會因為沖突出現報錯,本地解決沖突後送出代碼):git merge (branchname)
合并分支的某個檔案到目前分支上: git checkout --patch A分支 f 檔案
建立新分支并立即到該目錄下:git checkout –b(branchname)
删除分支:git branch –d(branchname)
重命名分支:git branch -m devel develop
(建立分支用來備份代碼)
檢視遠端分支:git branch –a
删除遠端分支:git push origin --delete (branchname)
強推覆寫代碼:git push -f
推送本地分支到遠端:git push origin (branchname)
跟蹤遠端分支并推送:git push --set-upstream origin (branchname)
重命名本地分支:git branch -m (old) (new)
檢視送出曆史:
列出曆史記錄:git log
列出前兩次送出記錄:git log -2
檢視某個作者的日志: git log --author="John"
曆史記錄簡潔版本:git log --oneline --decorate
什麼時候出現了分支、合并:git log –-oneline –grash
逆向顯示所有日志:git log --reverse --oneline
回退到某個版本:git reset --hard 版本号
回退到某個版本并儲存工作區修改:git reset --soft 版本号
删除未監視的檔案untracked files
# 删除 untracked files
git clean -f
# 連 untracked 的目錄也一起删掉
git clean -fd
# 連 gitignore 的untrack 檔案/目錄也一起删掉 (慎用,一般這個是用來删掉編譯出來的 .o之類的檔案用的)
git clean -xfd
# 在用上述 git clean 前,牆裂建議加上 -n 參數來先看看會删掉哪些檔案,防止重要檔案被誤删
git clean -nxfd
git clean -nf
git clean -nfd
GIT 标簽(tag)操作
# 檢視标簽
git tag 或者 git tag -l
# 檢視标簽版本資訊
git show [tagname]
# 打标簽(目前分支的目前版本)
git tag -a 'V1.0.0' -m '1.0版本'
# 打标簽(目前分支的某個曆史送出版本)
git tag -a 'V1.0.0' 4f96b167c52a858492bf65be3635d970727c0316 -m '1.0版本'
--參數a即annotated的縮寫,指定标簽類型,後附标簽名。參數m指定标簽說明,說明資訊會儲存在标簽對象中。
# 删除标簽
git tag -d V1.0.0
git push origin :refs/tags/v1.01 # 删除遠端标簽(就像git push origin :branch_1 可以删除遠端倉庫的分支branch_1一樣, 冒号前為空表示删除遠端倉庫的tag)
# 切換标簽
git checkout [tagname]
# 标簽釋出
git push origin [tagname]
git push origin tags # 将本地的标簽一次性送出到 git 伺服器
GIT cherry-pick 用法
cherry-pick:會重演某些commit, 即把某些commit的更改重新執行一遍。
案例:比如 A 是一個項目的版本分支,B 是另一個項目的版本分支。這時候想要把 B分支 的某個功能合并到 A 分支上,又不想全部合并,就要用到 cherry-pick 了。
用法:git cherry-pick [某個送出的id号]
tips:id 号可以通過 git log -2 獲得,擷取上兩次的送出記錄。
cherry-pick 不僅可以用在不同分支之間, 還可以用在同一個分支上。
同一分支用法也是一樣的, 同一分支使用情形:比如說你在某一個向某個分支中添加了一個功能, 後來處于某種原因把它給删除了,然而後來某一天你又要添加上這個功能了, 這時候就可以使用cherry-pick把添加那個功能的commit, 再重演一遍.
GIT解決 pull 沖突情況
沖突情況:本地進行了修改,想要 push 或 pull 的時候,别人已經送出,導緻内容沖突,push 或者 pull 失敗。
解決方法1(常見):
利用一些工具,比如 小烏龜、IDEA 等,打開沖突的檔案。先要了解,沖突的産生是因為你和别人修改了同一行的代碼,導緻 git 無法識别到底認可誰的代碼,導緻沖突。是以,解決沖突的途徑無非三種:要你的代碼;要他的代碼;你們兩個的代碼都要!之後,把修正後的代碼。重新送出。然後再 pull 或者 push 就好了。
解決方法2:
通過git stash
git stash
git pull
git stash pop
通過git stash将工作區恢複到上次送出的内容,同時備份本地所做的修改,之後就可以正常git pull了,git pull完成後,執行git stash pop将之前本地做的修改應用到目前工作區。
git stash: 備份目前的工作區的内容,從最近的一次送出中讀取相關内容,讓工作區保證和上次送出的内容一緻。同時,将目前的工作區内容儲存到Git棧中。
git stash pop: 從Git棧中讀取最近一次儲存的内容,恢複工作區的相關内容。由于可能存在多個Stash的内容,是以用棧來管理,pop會從最近的一個stash中讀取内容并恢複。
git stash list: 顯示Git棧内的所有備份,可以利用這個清單來決定從那個地方恢複。
git stash clear: 清空Git棧。此時使用gitg等圖形化工具會發現,原來stash的哪些節點都消失了。
解決方法3:
放棄本地修改
git reset --hard
git pull