git命令速查

常用操作與撤銷
git add xx.txt 把xx.txt添加到緩存區(qū)
git reset HEAD xx.txt把xx.txt從緩存區(qū)取消
git commit xx.txt -m '提交xx.txt' 提交本地倉庫
git reset –hard HEAD 撤銷之前的commit(HEAD是指向最新的提交,上一次提交是HEAD,上上次是HEAD^,也可以寫成HEAD~2 ,依次類推)
HEAD^ 可以替換成指定提交的hash值
如果不小心reset了,git reflog 查看記錄,并能過reset --hard找回之前reset的記錄
--hard請慎用,請慎用,請慎用
git commit --amend修改最后一次修改
比如:
git add a.txt
git commit -m"add a.txt,b.txt"
發(fā)現(xiàn)b.txt沒有提交,此時再執(zhí)行
git add b.txt
git commit --amend
此時會跳出編輯提交框,可以修改注釋及編輯修改的文件,esc鍵后WQ!保存退出后,則b.txt會附加到最后一次提交里面。
如果git commit --amend --no-edit則不會出現(xiàn)編輯確認(rèn)框直接修改。
git revert和git reset的區(qū)別
git revert是用新的一個commit來回滾之前的commit,HEAD是要繼續(xù)前進
git reset是直接刪除指定的HEAD,其是相當(dāng)于在不斷后退
git reset--hard** 會直接刪除掉目標(biāo)HEAD之后所有的操作,且工作去和暫存區(qū)都會修改
git reset --soft ,該命令會將工作去的文件回退到目標(biāo)版本,但是不會改變暫存區(qū)的狀態(tài)。
rebase與merge 區(qū)別
將dev分支合并到master分支
git merge dev直接合并,提交會按照時間排序
rebase操作dev上的操作會在master的后面
git checkout dev
git rebase master # 將dev上的操作在master分支上做一次衍合處理
# git提示出現(xiàn)了代碼沖突,此處為之前埋下的沖突點,處理完畢后
git add readme # 添加沖突處理后的文件
git rebase --continue # 加上--continue參數(shù)讓rebase繼續(xù)處理
tag標(biāo)簽與branch分支的區(qū)別
標(biāo)簽和分支都是引用,它們存儲的內(nèi)容也是類似的,都是指向一個commit對象的sha-1值。
tag的位置是固定的,在給指定提交打好標(biāo)簽以后,它就固定于此位置。分支的位置會不斷變動的,隨著分支的向前推移或者向后回滾,都在不斷變化。
git fetch與git pull的區(qū)別
git fetch 相當(dāng)于是從遠(yuǎn)程獲取最新到本地,不會自動merge。
git fetch orgin master //將遠(yuǎn)程倉庫的master分支下載到本地當(dāng)前branch中
git log -p master ..origin/master //比較本地的master分支和origin/master分支的差別
git merge origin/master //進行合并
或
git fetch origin master:tmp //從遠(yuǎn)程倉庫master分支獲取最新,在本地建立tmp分支
git diff tmp //將當(dāng)前分支和tmp進行對比
git merge tmp //合并tmp分支到當(dāng)前分支
git pull:相當(dāng)于是從遠(yuǎn)程獲取最新版本并merge到本地
git pull origin mastergit pull 相當(dāng)于從遠(yuǎn)程獲取最新版本并merge到本地
在實際使用中,git fetch更安全
commit點合并成一個commit點
rebase實現(xiàn)
git rebase -i commitId
參考自這里及這里
如果這個過程中有操作錯誤,可以使用git rebase --abort來撤銷修改,回到?jīng)]有開始操作合并之前的狀態(tài)。git merge --squash 選項
git merge --squash another
git commit -m "message here"
--squash含義和原理如下:
--squash選項的含義是:本地文件內(nèi)容與不使用該選項的合并結(jié)果相同,但是不提交、不移動HEAD,因此需要一條額外的commit命令。其效果相當(dāng)于將another分支上的多個commit合并成一個,放在當(dāng)前分支上,原來的commit歷史則沒有拿過來。
判斷是否使用--squash選項最根本的標(biāo)準(zhǔn)是,待合并分支上的歷史是否有意義。
如果在開發(fā)分支上提交非常隨意,甚至寫成微博體,那么一定要使用--squash選項。版本歷史記錄的應(yīng)該是代碼的發(fā)展,而不是開發(fā)者在編碼時的活動。
只有在開發(fā)分支上每個commit都有其獨自存在的意義,并且能夠編譯通過的情況下(能夠通過測試就更完美了),才應(yīng)該選擇缺省的合并方式來保留commit歷史。
忽略本地文件的修改
忽略file.txtgit update-index --assume-unchanged file.txt
恢復(fù)file.txt的跟蹤git update-index --assume-unchanged file.txt
查看當(dāng)前被忽略的、已經(jīng)納入版本庫管理的文件:git ls-files -v | grep -e "^[hsmrck]"
AndroidStuido或idea上的圖形化操作請移步idea提交git常見操作