2016-04-01 38 views
0

我想做一個HTML文件回購的git rebase。我有一個回購協議,看起來像:如何git rebase只更改文件

-- A -- B 
    \ 
    \-- C -- D -- E -- F 

我想變基˚F到B,但我有我不想。C介紹說,在ALL迴流文本的變化問題的HTML文件。我只想從D,E和F對這些提交中更改的文件進行更改。

因此,換句話說,我想:

-- A -- B -- D' -- E' -- F' 

EXCEPT:我想最後的承諾包括的f從git diff --name-only C..F返回的文件和文件從B.休息

不爲我工作的事情是:

git rebase --onto B D F 

因爲我必須做一個凌亂的合併,並手動選擇哪些文件,我想。我可以添加-X theirs,但我從C中獲得我不想要的文件。

所以,我的蹩腳的不幹的方法是在B的頂部創建一個新的自定義提交,在那裏我複製來自F的文件git diff --name-only C..F

有沒有更好的git方式來做到這一點?

(僅供參考,這裏就是我如何做沒有充分使用Git):

git diff --name-only C..F | xargs -I{} -n1 sh -c "git show F:{} > {}" 
+0

你有沒有嘗試過使用git cherry-pick? – Tim

+0

git櫻桃挑選有同樣的問題 - 除非你可以選擇你想櫻桃選擇的文件(也許你可以,我只是不知道)。 – Brian

+0

排除'C'但通過'F'保留'D'的分配應該是'git rebase --to B C F',而不是'git rebase --do D F'。如果那包括你不想要的文件,那就意味着你不需要'D'到'F'中的所有內容,這與你最初的要求相反。 – torek

回答

2

首先,git cherry-pick -n C-n意味着它會做櫻桃選擇,但不承諾。然後做出你喜歡和承諾的任何修改。我們稱之爲新提交C1

然後git rebase --onto C1 C F。請注意,範圍是獨家。它將從(但不包括)C發生變形。結果是D到F.當你使用像git rebase --onto master this that這樣的分支時,這更有意義。