正如在这个问题中所提到的,我也想知道如何解决冲突git stash pop而不添加对提交的所有修改(就像"git stash pop"而没有冲突).
我目前的方法非常不酷,因为我这样做:
git stash pop -> CONFLICT
git stash drop
[resolve conflict]
[add conflict files]
git reset HEAD <all files that are in commit-mode>
Run Code Online (Sandbox Code Playgroud)
[更新]一种重现它的方法:
mkdir foo; cd foo; git init
echo "1" > one
echo "2" > two
git add -A; git commit -m "first"
echo "1.1" > one
echo "2.1" > two
git stash
echo "2.2" > two
git commit -a -m "second"
echo "Only this file would stay in HEAD without the conflict" > third
git add third
git stash pop
git status
Run Code Online (Sandbox Code Playgroud)
2016-06-27:在示例中添加了一个名为"third"的新文件,以显示scy解决方案的解决方法仅适用于空HEAD但不解决HEAD不具有相同内容的初始问题对于git stash pop没有冲突.
Daw*_*žan 425
我不认为执行提交然后重置分支以删除该提交以及在其他答案中建议的类似解决方法是解决此问题的简洁方法.
以下解决方案对我来说似乎更清晰,Git本身也提出了这个问题 - git status在存储库中执行冲突:
Unmerged paths:
(use "git reset HEAD <file>..." to unstage)
(use "git add <file>..." to mark resolution)
Run Code Online (Sandbox Code Playgroud)
让我们做Git建议而不做任何提交:
git reset标记冲突(S)为解决和unstage的变化.您可以在没有任何参数的情况下执行它,Git将从索引中删除所有内容.你不必以前执行git add.git stash drop,因为Git不会在冲突时执行此操作.所以:
$ git stash pop
# ...resolve conflict(s)
$ git reset
$ git stash drop
Run Code Online (Sandbox Code Playgroud)
注意:解决冲突后将文件添加到索引是有意的.这样,您可以区分更改与先前存储的更改以及解决冲突后所做的更改.如果您不喜欢它,您始终可以使用git add从索引中删除所有内容.
另一个注意事项:我强烈建议使用任何三向合并工具来解决冲突,例如KDiff3.它通常会自动解决大多数冲突.
scy*_*scy 292
假设您有这种情况,您可以隐藏更改以从原点拉出.可能是因为您的本地更改只是debug: true在某些设置文件中.现在你拉,有人在那里引入了新的设置,造成了冲突.
git status 说:
# On branch master
# Unmerged paths:
# (use "git reset HEAD <file>..." to unstage)
# (use "git add/rm <file>..." as appropriate to mark resolution)
#
# both modified: src/js/globals.tpl.js
no changes added to commit (use "git add" and/or "git commit -a")
Run Code Online (Sandbox Code Playgroud)
好的.我决定采用Git的建议:我解决了冲突并承诺:
vim src/js/globals.tpl.js
# type type type …
git commit -a -m WIP # (short for "work in progress")
Run Code Online (Sandbox Code Playgroud)
现在我的工作副本处于我想要的状态,但是我创建了一个我不想拥有的提交.如何在不修改我的工作副本的情况下摆脱该提交?等等,有一个流行的命令!
git reset HEAD^
Run Code Online (Sandbox Code Playgroud)
我的工作副本尚未更改,但WIP提交已消失.这正是我想要的!(请注意,我不是--soft在这里使用,因为如果你的藏匿处中有自动合并文件,它们会自动暂存,因此你最终会在这些文件之后再次上传reset.)
但是还剩下一件事:man页面git stash pop提醒我们"应用状态可能会因冲突而失败;在这种情况下,它不会从存储列表中删除.您需要git stash drop手动解决冲突并在之后手动调用." 这正是我们现在所做的:
git stash drop
Run Code Online (Sandbox Code Playgroud)
并做了.
Com*_*uid 84
您可以使用git reset HEAD file解决冲突而不是暂存更改来代替添加您为解决冲突而进行的更改.
但是,您可能必须运行此命令两次.一旦将冲突标记为已解决并且一次取消暂停冲突解决例程所发生的更改.
有可能应该有一个同时完成这两件事的重置模式,尽管现在还没有.
ste*_*iel 25
git checkout stash -- .
Run Code Online (Sandbox Code Playgroud)
为我工作.
注意:这可能很危险,因为它不会尝试将存储中的更改合并到工作副本中,而是使用存储文件覆盖它.因此,您可能会丢失未提交的更改.
小智 9
git add .
git reset
Run Code Online (Sandbox Code Playgroud)
git add . 将暂存所有文件,告诉git您已解决冲突
git reset 将取消转储所有已转储的文件而不创建提交
没有问题。一个简单的git reset HEAD就是您正在寻找的,因为它使您的文件像非冲突的git stash pop.
唯一的问题是你的冲突文件仍然会有冲突标签,git 将不再报告它们与有用的“both_modified”标志冲突。
为了防止这种情况,只需在运行之前解决冲突(编辑和修复冲突的文件)git reset HEAD就可以了……
在此过程结束时,您的存储将保留在队列中,因此只需执行一次git stash drop即可将其清除。
这只是发生在我身上并用谷歌搜索了这个问题,所以解决方案已经过测试。
我认为这很干净......
看来这可能就是您正在寻找的答案,我还没有亲自尝试过,但看起来它可能会成功。使用此命令,GIT 将尝试像以前一样应用更改,而不是尝试添加所有更改以进行提交。
git stash apply --index
这是完整的解释:
http://git-scm.com/book/en/Git-Tools-Stashing
| 归档时间: |
|
| 查看次数: |
283863 次 |
| 最近记录: |