Git相關命令整理
工作中Git是一項不可缺少的技能,熟悉Git操作會讓工作效率更高,git merge、git rebase、git reset、git revert、git fetch、git pull、git reflog……這些 git 命令執行、是什麼任務自己還是不太瞭解,遂整理一波。
1、合併
擁有多個分支是很方便的,這樣可以將不同的新修改互相隔離開,而且還能確保你不會意外地向生產程式碼推送未經許可或破損的程式碼修改。但一旦這些修改得到了批准許可,我們就需要將其部署到我們的生產分支中!可將一個分支的修改融入到另一個分支的一種方式是執行 git merge。Git 可執行兩種型別的合併:fast-forward 和 no-fast-forward。
Fast-forward (—ff)
在當前分支相比於我們要合併的分支沒有額外的提交(commit)時,可以執行 fast-forward 合併。Git 很懶,首先會嘗試執行最簡單的選項:fast-forward!這類合併不會建立新的提交,而是會將我們正在合併的分支上的提交直接合併到當前分支。
No-fast-foward (—no-ff)
如果你的當前分支相比於你想要合併的分支沒有任何提交,那當然很好,但很遺憾現實情況很少如此!如果我們在當前分支上提交我們想要合併的分支不具備的改變,那麼 git 將會執行 no-fast-forward 合併。
2. 合併衝突
儘管 Git 能夠很好地決定如何合併分支以及如何向檔案新增修改,但它並不總是能完全自己做決定,我們需要自己修改衝突
案例如下:
3. 變基(Rebasing)
剛看到可通過執行 git merge 將一個分支的修改應用到另一個分支。另一種可將一個分支的修改融入到另一個分支的方式是執行 git rebase。
git rebase 會將當前分支的提交複製到指定的分支之上。
變基與合併有一個重大的區別:Git 不會嘗試確定要保留或不保留哪些檔案。我們執行 rebase 的分支總是含有我們想要保留的最新近的修改!這樣我們不會遇到任何合併衝突,而且可以保留一個漂亮的、線性的 Git 歷史記錄。
4、取回(Fetching)
如果你有一個遠端 Git 分支,比如在 GitHub 上的分支,當遠端分支上包含當前分支沒有的提交時,可以使用取回。比如當合並了另一個分支或你的同事推送了一個快速修復時。通過在這個遠端分支上執行 git fetch,我們就可在本地獲取這些修改。這不會以任何方式影響你的本地分支:fetch 只是單純地下載新的資料而已。
5、拉取(Pulling)
儘管 git fetch 可用於獲取某個分支的遠端資訊,但我們也可以執行 git pull。git pull 實際上是兩個命令合成了一個:git fetch 和 git merge。當我們從來源拉取修改時,我們首先是像 git fetch 那樣取回所有資料,然後最新的修改會自動合併到本地分支中。
6、Reflog
每個人都會犯錯,但犯錯其實沒啥!有時候你可能感覺你把 git repo 完全搞壞了,讓你想完全刪了了事。
git reflog 是一個非常有用的命令,可以展示已經執行過的所有動作的日誌。包括合併、重置、還原,基本上包含你對你的分支所做的任何修改。
如果你犯了錯,你可以根據 reflog 提供的資訊通過重置 HEAD 來輕鬆地重做!
假設我們實際上並不需要合併原有分支。當我們執行 git reflog 命令時,我們可以看到這個 repo 的狀態在合併前位於 HEAD@{1}。那我們就執行一次 git reset,將 HEAD 重新指向在 HEAD@{1} 的位置。
我們可以看到最新的動作已被推送給 reflog。
7、重置(Resetting)
當我們不想要之前提交的修改時,就會用到這個命令。也許這是一個 WIP 提交或者可能是引入了 bug 的提交,這時候就要執行 git reset。
git reset 能讓我們不再使用當前檯面上的檔案,讓我們可以控制 HEAD 應該指向的位置。
軟重置
軟重置會將 HEAD 移至指定的提交(或與 HEAD 相比的提交的索引),而不會移除該提交之後加入的修改!
假設我們不想保留添加了一個 style.css 檔案的提交 9e78i,而且我們也不想保留添加了一個 index.js 檔案的提交 035cc。但是,我們確實又想要保留新新增的 style.css 和 index.js 檔案!這是軟重置的一個完美用例。
輸入 git status 後,你會看到我們仍然可以訪問在之前的提交上做過的所有修改。
硬重置
有時候我們並不想保留特定提交引入的修改。不同於軟重置,我們應該再也無需訪問它們。Git 應該直接將整體狀態直接重置到特定提交之前的狀態:這甚至包括你在工作目錄中和暫存檔案上的修改。
Git 丟棄了 9e78i 和 035cc 引入的修改,並將狀態重置到了 ec5be 的狀態。
8、還原(Reverting)
另一種撤銷修改的方法是執行 git revert。通過對特定的提交執行還原操作,我們會建立一個包含已還原修改的新提交。
假設 ec5be 添加了一個 index.js 檔案。但之後我們發現其實我們再也不需要由這個提交引入的修改了。那就還原 ec5be 提交吧!
完美!提交 9e78i 還原了由提交 ec5be 引入的修改。在撤銷特定的提交時,git revert 非常有用,同時也不會修改分支的歷史。
9、分支函式 Branch
本地分支建立: git branch testing
檢視各個分支當前所指的物件: git log --oneline --decorate
分支切換: git checkout testing
專案分叉歷史: git log --oneline --decorate --graph --all
本地分支關聯遠端:git branch --set-upstream-to=origin/XXX XXX
10、其他(Other)
提交暫存區的指定檔案到倉庫區 git commit [file1] [file2] ... -m [message]
選擇一個commit,合併進當前分支 git cherry-pick [commit]
刪除分支 git branch -d [branch-name]
刪除遠端分支 git push origin --delete [branch-name]
顯示當前分支的版本歷史 gitlog
顯示commit歷史,以及每次commit發生變更的檔案 gitlog --stat
搜尋提交歷史,根據關鍵詞 gitlog -S [keyword]
顯示某個檔案的版本歷史,包括檔案改名 gitlog --follow [file]
顯示指定檔案相關的每一次diff gitlog -p [file]
顯示暫存區和工作區的差異 git diff
11、倉庫
下載遠端倉庫的所有變動 git fetch [remote]
顯示所有遠端倉庫 git remote -v
顯示某個遠端倉庫的資訊 git remote show [remote]
增加一個新的遠端倉庫,並命名 git remote add [shortname] [url]
取回遠端倉庫的變化,並與本地分支合併 git pull [remote] [branch]
上傳本地指定分支到遠端倉庫 git push [remote] [branch]
強行推送當前分支到遠端倉庫,即使有衝突 git push [remote] --force
推送所有分支到遠端倉庫 git push [remote] --all