git 将隐藏的更改与当前更改合并

wtlkbnrh  于 2023-06-28  发布在  Git
关注(0)|答案(9)|浏览(194)

我对我的分支做了一些修改,然后意识到我忘记了我已经隐藏了一些其他必要的修改。我想要的是一种将我隐藏的更改与当前更改合并的方法。
有办法做到这一点吗?
这更多的是为了方便,我最终放弃了,并首先提交了我当前的更改,然后提交了我的隐藏更改,但我更愿意一下子就把它们提交进去。

zfciruhq

zfciruhq1#

tl;dr

首先运行git add
我刚刚发现,如果将未提交的更改添加到索引中(即“staged”,使用git add ...),那么git stash apply(和,大概,git stash pop)实际上会进行正确的合并。如果没有冲突,你就是黄金。如果没有,请像往常一样使用git mergetool或使用编辑器手动解决它们。
说清楚点,这就是我说的过程:

mkdir test-repo && cd test-repo && git init
echo test > test.txt
git add test.txt && git commit -m "Initial version"

# here's the interesting part:

# make a local change and stash it:
echo test2 > test.txt
git stash

# make a different local change:
echo test3 > test.txt

# try to apply the previous changes:
git stash apply
# git complains "Cannot apply to a dirty working tree, please stage your changes"

# add "test3" changes to the index, then re-try the stash:
git add test.txt
git stash apply
# git says: "Auto-merging test.txt"
# git says: "CONFLICT (content): Merge conflict in test.txt"

……这可能就是你要找的。

siv3szwd

siv3szwd2#

运行git stash popgit stash apply本质上是一次合并。你不应该需要提交当前的更改,除非在stash中更改的文件也在工作副本中更改,在这种情况下,你会看到这个错误消息:

error: Your local changes to the following files would be overwritten by merge:
       file.txt
Please, commit your changes or stash them before you can merge.
Aborting

在这种情况下,您不能一步将stash应用到当前更改。如果你真的不想两次提交,你可以提交修改,应用stash,再次提交,然后使用git rebase压缩这两次提交,但这可能会带来更多的麻烦。

ruyhziif

ruyhziif3#

我想要的是一种将我隐藏的更改与当前更改合并的方法
这里是另一个选项来做到这一点:

git stash show -p|git apply
git stash drop

git stash show -p将显示最后保存的stash的补丁。git apply将应用它。合并完成后,可以使用git stash drop删除合并的stash。

fkvaft9z

fkvaft9z4#

我做这件事的方法是先git add,然后git stash apply <stash code>。这是最简单的方法。

ne5o7dgx

ne5o7dgx5#

你可以很容易地
1.提交当前更改
1.释放你的隐藏和解决冲突
1.提交来自stash的更改
1.软重置为您正在进入的提交(上次正确提交)

xriantvc

xriantvc6#

正如@Brandan所建议的,以下是我需要做的事情

error: Your local changes to the following files would be overwritten by merge:
       file.txt
Please, commit your changes or stash them before you can merge.
Aborting

请遵循以下流程:

git status  # local changes to `file`
git stash list  # further changes to `file` we want to merge
git commit -m "WIP" file
git stash pop
git commit -m "WIP2" file
git rebase -i HEAD^^  # I always use interactive rebase -- I'm sure you could do this in a single command with the simplicity of this process -- basically squash HEAD into HEAD^
# mark the second commit to squash into the first using your EDITOR
git reset HEAD^

您将得到对file的完全合并的 * 本地 * 更改,准备做进一步的工作/清理或进行一次良好的提交。或者,如果您知道file的合并内容是正确的,您可以编写一条合适的消息并跳过git reset HEAD^

b5buobof

b5buobof7#

也许,这不是最坏的主意合并(通过difftool)从...是的...分支!

> current_branch=$(git status | head -n1 | cut -d' ' -f3)
> stash_branch="$current_branch-stash-$(date +%yy%mm%dd-%Hh%M)"
> git stash branch $stash_branch
> git checkout $current_branch
> git difftool $stash_branch
dba5bblo

dba5bblo8#

我找到了另一个解决办法。您可以提交当前打开的更改,然后弹出隐藏,然后软重置到上次提交之前。

git commit -am 'Open changes'
git stash pop
git reset --soft HEAD~1
kmpatx3s

kmpatx3s9#

另一种选择是对本地未提交的更改执行另一个“git stash”,然后合并两个git stash。不幸的是,git似乎没有一种方法可以轻松地合并两个stash。因此,一个选择是创建两个.diff文件并同时应用它们--至少这不是一个额外的提交,也不涉及十个步骤的过程:|
如何:https://stackoverflow.com/a/9658688/32453

相关问题