因此,我们的设计师对一些图像进行了一些更改,并提交了更改.所以现在git log看起来像这样:
Commit 1: Changed images
Commit 2: Oops, forgot to commit a few images
Run Code Online (Sandbox Code Playgroud)
......然后企业希望它们看起来不同,所以设计师改变了它们,并再次承诺:
Commit 1: Changed images
Commit 2: Oops, forgot to commit a few images
Commit 3: Changed images again
Commit 4: Minor tweaks to new images just committed
Run Code Online (Sandbox Code Playgroud)
...现在,企业决定他们第一次更喜欢这些图像.所以现在我们需要回到他们接近开始的方式.我尝试了一些不同的方法,我认为我需要使用的方法是git revert,我可以创建一个新的提交,将图像恢复为以前的方式.但是,当我尝试这样做时,我似乎遇到了冲突.我应该如何做到这一点,以便我可以强制新的图像被改变Commit 1和Commit 2?
据我所知git checkout,在我们提交所有先前的更改之前,我们不允许结帐分支,但我的更改已被丢弃.
我执行了git status命令,它向我显示了修改过的文件列表.然后我执行了git checkout .(点)命令,但它没有提示我先提交我以前的更改并丢弃所有更改并检查我本地计算机上的master分支.
任何人都可以指导我为什么git checkout .这样做?以及如何在本地计算机上移回我之前的代码(使用修改和未提交的更改)?为什么要放弃我的更改?
注意:stackoverflow的bot认为该问题是主观的,但是非常事实-我在这里不要求意见!
假设我只有一个分支,而我的提交历史如下:A-B-C-D
如果我在GUI中单击C(例如GitKraken或Windows的Git)并执行“还原提交”,则会收到文件冲突消息。
两个问题:
这是因为还原“撤消”了在C中所做的更改,而GIT现在停留在B和D上了,它们以不同的不兼容方式修改了文件吗?那是原因吗?
如果是,这是否意味着您只能还原最近的提交?您能否在不造成冲突的情况下还原除上一次提交以外的其他提交?
更新:在@RomainValeri非常有用的澄清后,编辑问题。我认为我在恢复和重置之间造成了太多混乱。在下面的示例中,
git revert B
Run Code Online (Sandbox Code Playgroud)
使分支从
A-B-C-D
Run Code Online (Sandbox Code Playgroud)
至
A-B-C-D-E
Run Code Online (Sandbox Code Playgroud)
如果B是唯一更改了file2.txt的提交,并且B没有对其他文件进行任何其他更改,则还原后创建的新提交E将保留C和D中所做的所有更改,而不保留B中所做的所有更改。 。 它是否正确?
这是因为从技术上讲,还原意味着取消,撤消提交的任何更改-这是正确的吗?
另外:假设我的工作目录中只有一个文件。如果B是唯一更改文件中fun1()函数的提交,而所有其他提交都更改了同一文件中的其他函数,则还原B很可能会引起冲突,因为git会根据文件中的行来考虑,而不是文件中的功能。它是否正确?
假设B更改fun1(),C更改fun2(),D更改fun3()。然后,我意识到在fun1()的B处所做的更改是错误的,我需要撤消它们。如果所有这些功能都在同一个文件中,是否有办法撤消B中的更改,而同时保留C和D中的更改?
相反,如果这3个函数中的每一个都在单独的文件中,那么撤消一个提交的更改而不影响其他提交会更简单。
我想当然是单个文件不应太大或包含太多执行不同功能的函数的众多原因之一,对吗?
切换分支后,我应用了 stash(如下所示),这导致了自动合并。
? git stash apply
Auto-merging src/clojure/project_src.clj
On branch upgrade_project
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: src/clojure/project_src.clj
no changes added to commit (use "git add" and/or "git commit -a")
Run Code Online (Sandbox Code Playgroud)
我试过git revert HEAD哪个恢复了提交(不是自动合并)。如何恢复自动合并?
我正在尝试删除一些错误的 gitlab 提交。
其他线程中提供的答案是
当我尝试删除提交时,它们没有被删除。相反,在顶部创建了两个额外的合并。我确信这是正常的,但我不明白为什么它这样做,更重要的是,它没有删除提交。
如何完全删除提交,以便最后一个可用的提交是带有超人徽标的提交?谢谢
如何恢复/删除在旧的多文件提交中所做的更改,但仅在单个文件中进行?即类似的东西
git revert <commit-specifier> <file>
exceptgit revert不接受<file>参数。以下答案均未解决此问题:
Git:恢复单个文件上的旧提交而是关于如何调试冲突。
撤消 Git 中已推送到远程存储库的特定提交并不能解决我的单个文件问题。
Git:恢复较旧的提交也不能解决单个文件问题。
所以我一直在研究这个 PR,结果发现我需要恢复某个提交/推送,请注意,我在该提交之后创建了多个提交和推送,但我希望一切都保持不变,只有该提交才能恢复,这可能吗?如何实现?
需要一些帮助!
我知道可以使用reflog等来恢复这些更改,但我不知道怎么做!我知道有可能获得差异.我真的需要这些改变.
有任何想法吗??
我曾经git revert撤消已经提交并推送到我的开发分支的更改(这是我第一次使用此命令)并且一切顺利,但我需要知道是否可以:保持dev的方式,但是取回那些暂时更改,然后将它们添加到一个新的分支(不想与dev工作)?
假设我有一个提交列表:
A > B > C > D > E ,如何从历史记录中删除C中所做的更改A > B > D > E?
git ×10
git-revert ×10
git-commit ×2
github ×2
git-add ×1
git-branch ×1
git-checkout ×1
git-merge ×1
git-reflog ×1
git-stash ×1
gitlab ×1