我和一位朋友在一个项目上合作,他编辑了一堆本不应该编辑过的文件.不知怎的,我将他的作品合并到了我的作品中,或者当我拉动它时,或者当我试图选择我想要的特定文件时.我一直在寻找和玩很长一段时间,试图弄清楚如何删除包含对这些文件的编辑的提交,它似乎是revert和rebase之间的折腾,并没有简单的例子,并且docs假设我比我知道的更多.
所以这是问题的简化版本:
鉴于以下情况,如何删除提交2?
$ mkdir git_revert_test && cd git_revert_test
$ git init
Initialized empty Git repository in /Users/josh/deleteme/git_revert_test/.git/
$ echo "line 1" > myfile
$ git add -A
$ git commit -m "commit 1"
[master (root-commit) 8230fa3] commit 1
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 myfile
$ echo "line 2" >> myfile
$ git commit -am "commit 2"
[master 342f9bb] commit 2
1 files changed, 1 insertions(+), 0 deletions(-)
$ echo "line 3" >> myfile
$ …Run Code Online (Sandbox Code Playgroud) 我想从线性提交树中删除选定的提交日志条目,以便条目不会显示在提交日志中.
我的提交树看起来像:
R--A--B--C--D--E--HEAD
Run Code Online (Sandbox Code Playgroud)
我想删除B和C条目,以便它们不会在提交日志中显示,但应保留从A到D的更改.也许通过引入一个提交,使B和C成为BC并且树看起来像.
R--A--BC--D--E--HEAD
Run Code Online (Sandbox Code Playgroud)
或者,理想情况下,A直接来自D.D'表示从A到B,B到C和C到D的变化.
R--A--D'--E--HEAD
Run Code Online (Sandbox Code Playgroud)
这可能吗?如果有,怎么样?
这是一个相当新的项目,因此目前没有分支,因此也没有合并.
如何使用GIVEN SHA恢复提交?我只是想用给定的SHA删除更改?我希望在给出SHA之前和之后保留所有提交的内容.我只想删除指定SHA的更改.
我已经在Git中读了一个SHA哈希提交的Revert?,我的理解是重置所有提交后我想要恢复的SHA.这不是我想要的方式.
我们有一个主分支,我们已经合并了大约10个功能分支,一次一个.
所以最近的历史看起来像这样:
merged feat/10 (HEAD of master)
merged feat/9
merged feat/8
merged feat/7
merged feat/6
merged feat/5
...
Run Code Online (Sandbox Code Playgroud)
现在我们发现这feat/7很糟糕,我们想把它从主人那里拿走.恢复合并提交是不够的,因为我们根本不希望破坏的提交存在于我们的历史记录中.我们不能真正使用交互式rebase,因为这将使历史变得平坦,使其看起来好像是在一个分支上完成的,并且我们希望保留所有良好的合并历史记录.
有没有办法从分支的历史中删除特定的合并提交?
我会注意到真实的历史要比你在上面的例子中看到的要复杂得多,所以手动重新进行所有的合并,因为feat/7不是一个好的选择.
编辑
为了澄清那些投票将其作为一个副本关闭的人:这不是关于如何使用rebase进行提交的常见问题解答,当然这已被多次回答.这里的问题是关于在没有展平合并历史的情况下进行提交.
在我的工作目录中意外地放了一个非.gitignore排除的大文件我提交了我的更改,推送到github然后做了一个git push heroku到生产.
当我看到它试图将数百MB的数据推送到heroku时,我杀死了这个过程.
因为我已经做了
git rm filename.extension
之后
git add .,一个新的承诺和混帐推.但是,当我到达git push heroku它坚持继续推动这个不可能的大数据文件.
我如何检查有问题的文件是什么,以及如何让git/heroku忘记它曾经存在,所以git push heroku可以重新开始工作......?
谢谢!
这个项目只有一个master分支,所以所有的工作都在那里完成。
我错误地犯了一个错字,虽然我可以提交撤消,但我想我会尝试完全删除提交。
提交哈希是dbcbf96b,并且ded82215是它之前的提交。因此,根据这些说明,我这样做了:
git rebase -i ded82215这在编辑器中显示了“待办事项”列表,如预期的那样,仅包含以下内容:
pick dbcbf96 Writer update.
Run Code Online (Sandbox Code Playgroud)大概是按照该生成文件的注释中的说明,我将该行更改为:
drop dbcbf96 Writer update.
Run Code Online (Sandbox Code Playgroud)我保存了文件并关闭了编辑器。然后它说:
Successfully rebased and updated refs/heads/master.
Run Code Online (Sandbox Code Playgroud)然后我检查了 GitLab(我用来托管它的东西)希望看到提交消失了,但事实并非如此,它仍然存在。
我确实git status查看了它推荐的操作并产生了:
On branch master
Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
(use "git pull" to update your local branch)
nothing to commit, working tree clean
Run Code Online (Sandbox Code Playgroud)这有点道理,但至于变基,我不确定发生了什么。现在我确实git pull更新了本地存储库,但一切都刚刚回到我开始dbcbf96b的地方,回到本地文件仍然包含更改,本地存储库是最新的,并且 GitLab 仍然显示修订版。该pull命令产生:
Updating ded8221..dbcbf96
Run Code Online (Sandbox Code Playgroud)所以我的 rebase …