2014-03-27 72 views
0

如果我想從功能分支中選擇一個文件並將其合併到master中,並且如果真正的合併不重要,我將使用git checkout。但是,如果在master中對同一文件進行了新更改,則結帳操作將覆蓋這些更改。使用git checkout來合併文件

我想git checkout要做的事情基本上是合併文件的變化,而不是簡單地覆蓋它們(這似乎與它的目的相反,我知道)。它應該基本上做下列步驟操作:

git diff <sha1>..<sha2> > changes.patch 
git apply changes.patch 

當然,我可以創建一個別名這樣做,但我在看是否git checkout能爲我做到這一點特別感興趣。

回答

0

主要綜合Grantovich的文章和我對它的評論&hellip;

在Git中進行合併,因爲它們對提交進行操作,發生在由合併的兩個(或多個)方面的提交表示的存儲庫的整個快照上,所以不,基本上沒有辦法只合並一個文件。

你可以做些什麼儘管這樣的:

  1. 確保你的工作樹和索引是乾淨的(可能使用git stash,如果你有你不想尚未提交更改)。
  2. 執行git cherry-pick -n <commitish>其中<commitish>包含您要選擇的更改。 -n--no-commit命令行選項可防止此命令在沒有衝突時自動記錄新的提交。
  3. 在您想合併的文件之外的所有文件中都會發生更改。爲此,請使用git reset

在另一方面,git read-tree(這在Git中進行合併的命令)的手冊中提到的git merge-one-file命令,可能只是做你想要什麼。不幸的是,它似乎很低級,說實話我從來沒有嘗試過使用它。

0

git cherry-pick是您發佈的兩個命令的一站式版本。鑑於這個工具存在,我不認爲有調用git checkout將做同樣的事情–無論如何它看起來像一個工具的預期目的的真正延伸。

+0

在這種情況下應用'git cherry-pick'的問題是它不能理解單獨的文件,所以你不能僅僅使用這個命令帶來單個文件的改變 - 我的意思不是簡單的:你可以調用'git cherry-pick --no-commit ...',然後手動取消除了單個文件以外的所有更改,但這很麻煩。可能比'git diff' +'git apply'路徑更混亂,但仍然... – kostix

+0

Robert提供的差異/應用示例也不會選擇對單個文件的更改,因此我認爲挑選櫻桃將是一個可接受的解決方案。櫻桃挑選提交中的個別更改只是要求頭痛 - 我要重新設置功能分支,所以我想要的更改實際上是在單獨的提交中,然後選擇提交。 – Grantovich

+0

我可以做'git diff .. - path/file.cpp> file.patch'。所以是的,我只能修補一個文件 –