Git结帐并合并而不触及工作树

时间:2009-09-10 01:37:45

标签: git

假设我有一个功能分支,在推送我的更改之前我合并上游更改:

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

编辑:

我只谈论快速合并,根据定义,它不会改变文件的状态。

4 个答案:

答案 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"