考虑到您不想清理工作目录,我假设您的意思是您不想通过某些脚本清理您的工作树或索引。在这种情况下,您无法在当前本地存储库的范围内找到解决方案。Git 在合并时广泛使用索引。如果没有冲突,我不确定工作树是否也是如此,但总的来说,合并与当前检出的分支密不可分。
不过,还有另一种方法,不需要您更改当前存储库中的任何内容。但是,它要求您拥有或创建存储库的克隆版本。基本上,只需克隆您的存储库,然后在克隆版本中执行合并操作,并将其推回到原始存储库。以下是一个简短的示例,说明它将如何工作。
首先,我们需要一个样例存储库。以下命令序列将创建一个存储库。您最终会以
master
作为当前分支,并且有两个名为
change-foo
和
change-bar
的其他分支进行合并的更改。
mkdir background-merge-example
cd background-merge-example
git init
echo 'from master' > foo
echo 'from master' > bar
git add .
git commit -m "add foo and bar in master"
git checkout -b change-foo
echo 'from foo branch' >> foo
git commit -am "update foo in foo branch"
git checkout -b change-bar master
echo 'from bar branch' >> bar
git commit -am "update bar in bar branch"
git checkout master
现在,想象一下你正在工作的是master
分支,你想要将change-bar
合并到change-foo
中。这里是一个半图形化的描述:
$ git log --oneline --graph --all
* c60fd41 update bar in bar branch
| * e007aff update foo in foo branch
|/
* 77484e1 add foo and bar in master
以下步骤将完成合并操作,不会影响当前主分支。将其封装成脚本,便可得到一个漂亮的“后台合并”命令:
git clone file://`realpath .` tmp
cd tmp
git checkout change-foo
git branch --track change-bar origin/change-bar
git merge change-bar
git push origin change-foo
cd ..
rm -rf tmp
简要来说,这将把当前存储库克隆到一个子目录中,进入该目录,执行合并,然后将其推回原始存储库,完成后删除子目录。在大型项目中,您可能希望有一个专用的克隆版本仅保持最新状态,而不是每次都进行全新克隆。合并和推送之后,我们会得到以下结果:
$ git log --oneline --graph --all
* 24f1916 Merge branch 'change-bar' into change-foo
|\
| * d7375ac update bar in bar branch
* | fed4757 update foo in foo branch
|/
* 6880cd8 add foo and bar in master
有问题吗?
git push .
中的点号代表什么意思? - Ram Rachum