假设我有一个功能分支,在推送我的更改之前我合并上游更改:
git branch feature1
... [edit my code]
... [commit]
git fetch origin master
git merge fetch_head [or rebase]
... [resolve conflicts]
... [build and test code]
此时我想推动我的改变。这样做的正常方法是:
git checkout master [changes a bunch of working tree files]
git merge feature1 [changes the same files right back]
这样可以正常工作,但会使(日期检查)编译器认为一堆文件很脏并且即使内容相同也需要重建。在这种情况下,有没有办法结帐并使工作树保持不变?
类似的东西:
git checkout master --merge-branch feature1
编辑:
我只谈论快速合并,根据定义,它不会改变文件的状态。
答案 0 :(得分:41)
一种简单而安全的方法 - 无需推送或强制更新 - 将feature1提取到master中:
(feature1)$ git fetch . feature1:master
From .
4a6000d..8675309 feature1 -> master
诀窍是使用.
来获取本地 feature1 ref。这比强制更新主分支更安全,因为它确保更新是快进的。 (有关详细信息,请参阅git-fetch documentation中的< refspec>参数。)
现在feature1和master是相同的,它们之间的切换不会触及任何文件:
(feature1)$ git checkout master
Switched to branch 'master'
(master)$
答案 1 :(得分:8)
[编辑]这只是部分解决方案/解决方法。请参阅下面@djpohly的实际答案。
首先,你可以从任何地方推送。无论您检查了什么,或者您想要推送的提交是否都在掌握中。
git push REMOTE_REPO feature1:master
请参阅git help push
提示:git push remoteRepo localRef:remoteRef
至于把大师带到你现在的位置而不是摆弄你的工作副本......你可以这样强迫它:
# (while still on feature1 branch)
git checkout -B master origin/master
但是这对主人来说很难重置。即它不会检查快进。
答案 2 :(得分:2)
合并(或rebase)无法在不触及工作目录(和索引)的情况下工作,因为可能存在必须使用工作目录(和/或索引)解决的合并冲突。
您可以随时拥有另一个克隆(可能使用替代,或符号链接对象目录,以节省磁盘空间),或使用contrib/workdir/git-new-workdir
的其他工作目录。或者使用ccache等工具。
答案 3 :(得分:0)
如果你只关心几个文件而你正在使用Unix,你可以使用touch -d <timestamp>
在事后更改手动修复mtime。确保使用ls --full-time
来获取时间戳,因为默认显示缺少精确度。
例如,假设您使用Docker为基于Python的Web应用程序构建映像。如果requirements.txt
文件发生更改,则需要很长时间才能重建,因为它必须下载一堆第三方库并进行编译。只需在合并后重置该文件的mtime:
ls -og --full-time src/requirements.txt
# -rw-r--r-- 1 282 2015-11-04 20:03:28.918979065 +0400 src/requirements.txt
git checkout master
git merge --no-ff feature-foo
touch src/requirements.txt -d "2015-11-04 20:03:28.918979065 +0400"