16

这个问题的简短版本是这样的:如何在git不触发自动合并的情况下弹出存储?


现在对于更长的版本...

考虑以下替代git stash ... + git pull ... + git pop.

首先,git status表明工作目录中的唯一修改是对某些跟踪文件foo

# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   foo
#
no changes added to commit (use "git add" and/or "git commit -a")

现在,为了将工作目录重置为干净状态,作为运行的先决条件git pull,我暂时将修改后的文件重命名foo(为一些未跟踪的名称),并恢复fooin HEAD...

% mv foo foo.$(date +%Y%m%dT%H%M%S)
% git checkout foo
% git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   foo.20130508T110014
nothing added to commit but untracked files present (use "git add" to track)

好的,现在我运行git pull,为了这个例子,我们可以假设它是一个快进:

% git pull

最后,我恢复了临时重命名的foo.

% mv foo.20130508T110014 foo

...我又回来了

% git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   foo
#

这是 a 的“道德等价物” git stash save + git pull + git stash pop,除了前者而不是后者不受“合并冲突”的影响,例如:

% git stash save 'WIP'
% git pull
% git stash pop
Auto-merging foo
CONFLICT (content): Merge conflict in foo

如何在触发自动合并的情况下rename-checkout-pull-rename使用 复制上述序列?git stash save + ... + git stash pop

顺便说一句,该rename-checkout-...-rename例程更接近于我对名为stash. 换句话说:现在保存我的工作目录的状态,稍后替换它。这张照片中没有“合并”。

4

4 回答 4

8

我很晚才意识到,git已经为引发这个问题的问题提供了一个非常简单的解决方案(即自动合并,有可能将存储库置于“未合并状态”)。

所有需要做的就是使用

git stash branch <branchname> [<stash>]

而不是git stash pop(或git stash apply)。为了应用隐藏的更改而<branchname>创建的新分支的名称在哪里。git

这以保证没有冲突的方式弹出存储。

于 2014-02-08T19:12:59.313 回答
5

stash合并,这就是它的工作原理。

write-tree read-tree您可以使用 with和来实现非合并存储checkout-index这是一个实现原始测试环境的工作示例

要强制应用非合并存储,您可以例如

git read-tree stash^{tree}
git checkout-index -af
于 2013-05-08T21:47:38.953 回答
3

好的,在遇到这样的事情后:

% git stash pop
Auto-merging foo
CONFLICT (content): Merge conflict in foo
Auto-merging bar
CONFLICT (content): Merge conflict in bar
Auto-merging baz
CONFLICT (content): Merge conflict in baz
...

# $#@?!?!%$!*@#...

...我设法提出的最佳解决方案是对此做出回应:

% git checkout --theirs $(git diff --name-only --diff-filter=U)
% git reset
% git stash drop

(基于这个答案。)

于 2013-05-08T21:19:11.853 回答
2

您看到合并冲突的事实意味着foo您从服务器中提取的文件发生了更改。因此,复制您的文件并移回将完全消除foo文件中存储库中的所有更改。如果您这样做,那么提交更改的其他人foo会讨厌您。

您的问题的答案取决于您要完成的工作。您是否尝试查看服务器上的更改与您的代码进行了比较?在完成之前,您是否试图避免处理其他人的代码?

如果您只想查看对分支的更改,您可以使用git fetch代替git pull并将当前代码与该代码进行比较。或者,如果您现在不想合并更改,请考虑在单独的分支中工作,或者在您准备好合并之前不要拉取。

于 2013-05-09T17:03:04.080 回答