2013-01-17 116 views
3

我想檢索一個提交列表作爲補丁,然後嘗試將它們應用到另一個存儲庫中,該存儲庫中存儲了一個非常接近的項目,以至於我想要檢索補丁:我如何在一個命令中檢索所有補丁? git format-patch和git log -p最好的方法(和差異)是什麼?Git format-patch vs git log -p

+0

你看過'git bundle'嗎? –

+0

感謝這似乎很有趣,但我正在尋找簡單的東西 – Newben

+1

@Newben如果提交共享歷史,'git bundle'非常簡單:用'git bundle創建一個捆綁包create my-bundle HEAD〜10..HEAD'(retrieve最後十次提交,'HEAD〜10'應該出現在目的地上)。使用'git fetch my-bundle:somebranch'在目標上檢索它。現在你有了'somebranch'的提交,你可以合併或rebase,只要你認爲合適。 – user4815162342

回答

1

我相信你可以嘗試使用git bundle命令以及創建二進制檔案,然後將其應用於存儲庫的另一個副本。

但是我會說這種方法並不比使用git format-patchgit am更靈活,但如果您不想手動查看每個補丁,可能會更快。

git bundle create file.name revision..list - 將在當前文件夾中創建包含file.name的文件,並在其中放入指定修訂的內容。

git bundle unbundle file.name恢復修改在不同的地方。

2

git log -p向您顯示反向時間順序(最近的第一個)的變化。這通常不適合用於生成補丁,因爲您希望開始使用最早的修改而不是最新修補。

git format-patch產生在正確的方向上的補丁(補丁0001將是最早的變化),並將其保存補丁一個提交-每個文件並將它們格式化爲適合於與git am在接收側使用的電子郵件消息。

所以你想要的東西,它可能是很有道理的到目標存儲庫上的一個倉庫上運行git format-patch然後git am

cat *.patch | git am 
+0

現在有一個git日誌 - 反向。 – yucer

0

如果你通過git log格式化前綴爲「 - 」符號的路徑的數字,那麼所有的補丁可以在不同的文件中一次生成。例如:

git format-patch $(git log --reverse 073dd505f..fff28ff65 --pretty="%H" -- the/needed/path | awk '{print -NR, " ", $0}') 

這將覆蓋您可以從git log應用的所有過濾器。他們不是連續的提交。例如採取相應的給定用戶的斑塊:

git format-patch $(git log --reverse --author="John Doe" --pretty="%H" -- the/needed/path | awk '{print -NR, " ", $0}') 

的--reverse選項需要給你按時間順序排列的補丁,因爲git的日誌先給最近期]。

+0

謝謝你的回答,我終於解決了我的問題;) – Newben