如何在git中合并两个分支,从分支中保留必要的文件?
合并两个分支时,如果文件在一个分支中删除而在另一个分支中没有删除,则最终删除该文件.
例如:
如何再现:
用一个文件创建一个git repo.
git init
echo "test" > test.txt
git add .
git commit -m "initial commit"
Run Code Online (Sandbox Code Playgroud)创建一个分支
git branch branchA
Run Code Online (Sandbox Code Playgroud)删除master中的文件
git rm test.txt
git commit -m "removed file from master"
Run Code Online (Sandbox Code Playgroud)在branchA中进行任何不接触已删除文件的更改(必须保持不变以避免冲突)
git checkout branchA
touch something.txt
git add .
git commit -m "some branch changes"
Run Code Online (Sandbox Code Playgroud)从这里,我发现合并这两个分支的任何方式都删除了test.txt文件.假设我们依靠文件的branchA,这是一个很大的问题.
失败的例子:
合并1
git checkout branchA
git merge master
ls test.txt
Run Code Online (Sandbox Code Playgroud)
合并2
git checkout master
git merge branchA
ls test.txt
Run Code Online (Sandbox Code Playgroud)
Rebase 1
git checkout branchA
git rebase master
ls test.txt
Run Code Online (Sandbox Code Playgroud)
cmc*_*nty 29
这是一个有趣的问题.因为你删除后的文件BranchA被创建,然后被合并master到BranchA,我不知道混帐如何能够实现有冲突.
错误合并后,您可以撤消,然后重新合并,但添加回文件:
git checkout HEAD@{1} .
git merge --no-commit master
git checkout master test.txt
git add test.txt
git commit
Run Code Online (Sandbox Code Playgroud)
为了在这种情况下快速修复,"git revert"删除文件的提交.
当这种情况在未来出现时,处理它的更好方法是确保在分支上发生新文件的创建.然后在合并时将其添加到master上,但在此期间您没有在master中放置文件.
Casey的示例不适用于我的情况-我无法test.txt从检出master,因为它不再位于该分支中:
$ git checkout master test.txt
error: pathspec 'test.txt' did not match any file(s) known to git.
Run Code Online (Sandbox Code Playgroud)
幸运的是,我可以将文件拉出branchA自己的文件HEAD:
$ git checkout branchA
$ git merge --no-commit master
$ git checkout HEAD test.txt
$ git add test.txt
$ git commit
Run Code Online (Sandbox Code Playgroud)
我的解决方案是简单地修改我需要保留的文件(添加无论如何都需要的注释)并在目标分支上提交这些更改,从而生成合并冲突,可以通过git add正常提交轻松解决。
我的历史是这样的。为了保护无辜者,分支名称已更改。
git merge master会导致原始文件被删除(当然),git reset --hard直到合并之前| 归档时间: |
|
| 查看次数: |
42875 次 |
| 最近记录: |