Git 2.4 — 原子推送、推送釋出等

oschina發表於2015-05-08

儘管Git的10年生日慶典,Git社群一直忙於準備另一個主要的Git命令行實用程式的新版本。釋出2.4.0是偏重於清理,修復bug,和其他小的改進,但在這裡我們想花一些時間來突出一些新功能,您可能會發現有用的。

原子推送

直到現在,當你試圖推送多個分支到遠端Git伺服器,某些更新可能成功而另一些失敗了。 例如,別人可能已經推送了一個分支,這意味著你必須協調您的更改並嘗試再次推送分支。

出於一些原因或許你想在原子級別提交一組引用修改,那就意味著,要麼提交的修改全部更新更新成功,要麼都沒有。現在可以使用git push的 –atomic引數實現這一功能:

$ git push --atomic origin branch1 branch2 ...

這一功能可能對自動化工具更有用。例如,你有個在一個分支上進行持續整合的工具,如果測試成功它將合併這個分支到 master,建立一個新的標籤,同時對這個 commit 新增一個 notes。上面的三件事情,可以使用下面的命令同時完成:

$ git push --atomic origin master refs/tags/release-17 refs/notes/test-results

其中,–atomic 選項保證上面的三個引用在遠端伺服器上都執行成功,要麼都沒有執行成功。

需要注意的是 git push –atomic 仍然是實驗性的,它可能會有部分更新,所以不要用它推送重要的東西。當你使用–atomic選項,更新被拒絕的常見的原因是——可怕的”non-fast-forward”更新 —— 它不會讓你的更新半接受,半拒絕。 [來源]

改進 Push-to-deploy

最新的Git版本,Git 2.3,引入了直接推送到遠端Git伺服器上已簽出的分支上的能力。簡化了對網站部署新版本,現在只需通過推送即可。(但請閱讀我們最新的Git釋出版博文 來了解一些使用這種方法的注意事項。)

Git 2.4 改進 push-to-deploy 通過兩種方式:

  • 現在有一個 push-to-checkout 鉤子,可以將它安裝到伺服器上通過定製來精確地得到當一個使用者推送到已檢出分支上時發生了什麼。例如,預設情況下,伺服器上的工作樹發生了任何改變都會造成推送失敗,push-to-checkout 鉤子可以代替,它會試圖將任何伺服器端的編輯與新分支的內容合併,或者它可以無條件地用已推送分支的內容的原始副本來覆蓋任何本地改變。[來源]
  • Push-to-deploy 以前在推送到伺服器上的一個“未來分支”時並不能正確工作。(未來分支是Git對一個沒有任何提交的分支的稱呼,例如初始化一個 Git 倉庫後立即推送)。現在,它已經可以如預期的那樣正常工作,這有望減少那些試圖對新專案設定 push-to-deploy 的使用者的困惑。[來源]

對日誌反選 grep

git log 是一個非常強大的命令,具有令人眼花繚亂的眾多選項。一類有用的選項包括 –grep=<pattern>,–author=<pattern>,–committer=<pattern>, 和 –grep-reflog=<pattern>,限制相應地輸出匹配指定的正規表示式的提交的提交資訊,作者,提交者或 reflog 條目。

現在有了一個新選項,–invert-grep,反選其它模式匹配選項。當使用這個選項時,git log 將會列出那些與指定模式不匹配的提交。例如,搜尋那些提交資訊中不包含“Fixes”宣告的合併提交,你可以執行

$ git log --all --merges --invert-grep --grep=Fixes

[來源]

高階用法

它不能夠把模式匹配合併到任意表示式裡邊,比如在單個git log命令中“匹配A和B但非C”。但是現在,由於有了–invert-grep,你可以使用管道通過字串命令這樣操作, 雖然有點微妙。舉個例子,假設你想要在GIT master 分支裡邊查詢由維護者(Junio Hamano)所建立的未合併的提交,並且排除“Signed-off-by”:

$ git rev-list --no-merges --author="Junio C Hamano" master |      git log --stdin --no-walk --invert-grep --grep='^Signed-off-by:'

值得注意的是第一個命令使用git rev-list,僅僅列出匹配提交的SHA-1s,而不是顯示提交資訊等。git rev-list和git log一樣帶有許多引數選項。它的輸出作為第二個命令的輸入, 使用–stdin –no-walk從標準輸入讀取SHA-1s提交,並只處理這些提交。(沒有–no-walk引數,第二個命令將處理傳遞給它的提交的原型。)因此第二個命令忽略了包含“Signed-off-by”的提交,並把剩下的輸出。

結果是通過之前的命令所列出來的許多提交是“revert”提交,這些都不是真正需要 Signed-off-by 這一行, 所以讓我們排除 revert 的提交來計算剩下的有多少:

$ git rev-list --no-merges --author="Junio C Hamano" master |      git rev-list --stdin --no-walk --invert-grep --grep='^Signed-off-by:' |      git rev-list --stdin --no-walk --invert-grep --grep='^Revert ' |      wc -l76

和你看到的一樣,它可以把使用這些構建塊的複雜查詢放在一起。

其他小改進

  • git status 現在允許 –verbose 選項來二次指定,在這種情況下,它顯示了一些已經被 stage 過但未被提交的改動,還有一些在未被 stage 的工作樹種的改動。[source]
  • git log –decorate,在平常的 log 輸出旁邊列出分支名稱, 現在顯示的不僅僅是當前 HEAD,而且還指明瞭當前指向哪個分支,使用這種格式(HEAD -> master). [source]
  • 配置設定 push.followTags,用來預設開啟 git push 的 –follow-tags 選項。 [source]
  • 在傳送請求的時候,基於 HTTP 的傳輸會傳送 Accept-Language 頭部。這也將開放通過 Git 伺服器發出的國際化資訊報文的方式,儘管這一切尚未開始。 [source]

剩下不受關注的部分

除了以上值得關注的列表,相比 Git 2.3.0 版本還有一些小的改進 —— 總共超過 400 個 commits,76 個不同的貢獻者。詳細情況請看 Git 2.4.0 發行說明。或者,更好的方法是使用 Git 自身檢視 commits:

$ git clone https://github.com/git/git.git$ cd git$ git log --oneline --graph v2.3.0..v2.4.0

想升級你的 Git 技能嗎?那麼可以去檢視 Git 主站的文件,grab 一份 Pro Git 的副本,或者檢視 GitHub 上的 Git 設定指南

協作愉快!

相關文章