git 如何检出提交进行一些更改并将其推回主服务器

git how to checkout to a commit make some changes and push it back to master

所以我在 master 分支中有很多提交。我想回滚到提交并在一个文件中进行一些更改。它只是与 checkout 命令有关。

那么我的步骤是什么。 1. 我已经从 master git checkout -b new_branch 签出新分支 2. 然后在 new_branch 我做了 git checkout f95ecfe 回滚到提交。

现在是:HEAD detached at f95ecfe

在这个阶段我想添加一些更改并将这个新分支推送到 bitbucket。

我应该做一些其他操作还是我可以简单地制作 git push origin new_branch

在这个提交 f95ecfe 之后的主分支中,我还有许多其他提交,所以我的问题也是如何正确地将这个带有分离头的新分支与主分支合并。它会只合并一个我修改过的文件,还是会合并来自新分支的整棵树,所有文件的状态都与主树不同?

您可以在您所在的州创建一个分支,然后像任何其他分支一样执行您的操作。

分离头状态仅意味着您所做的任何更改都不在分支上,如果您转到分支,则可能会丢失。所以您可以继续进行更改并提交它们。然后将它们发送到远程执行以下操作:

//Create a branch at your current state.
// you can also do this before committing.
git branch <new branch name> 
//Send it to the remote.
git push origin <new branch name>

现在您的更改就像任何其他分支一样。如果您想将您的更改纳入 master,您需要做的就是 git merge 并解决因您的更改而发生的任何冲突。

This page has an explanation of detached head. 基本上,您正在探索本地存储库中的代码。但是如果你换到一个分支,你的提交就会四处飘荡。它们不是要引用的分支的一部分,并且会在某个时候被垃圾收集。为了保留更改,您只需要创建一个分支,您的提交可以成为其中的一部分。

您应该将推送的 master 视为神圣的(除非您是唯一编辑它的人)。否则,如果你开始重新排序 master,(即你回到过去,更改提交,然后 "force push" 它们),那么你实际上是在重写历史。其他任何拉过 master 的人在再次拉取时都会出现不一致,并且必须解决它们。痛彻心扉。

有几种不同的方法可以保持 'nice master',具体取决于您的偏好/您的合作对象。

以下是我建议您在这些情况下如何处理您的情况:

线性大师

我的偏好是线性大师 - 所以这意味着无论何时有人推动,他们首先在大师之上变基,然后推动。 master然后就是一条直线,你不会得到很多分支合并混乱的东西。

你应该做的只是在你的主人的 end 添加一个修复文件的提交,然后推送它,在提交消息中识别你正在修改的上一个提交等等

也就是说,您按照以下方式进行操作:

git checkout master
git add FILE_TO_CHANGE
git commit -m 'Bug fix for f95ecfe (Plus more details, obviously)'
git push origin master

(可选地,创建一个 bug 修复分支来处理,然后稍后将其删除,完整的工作流程可能类似于):

git pull --rebase origin master //Pull latest code
git checkout master // Move head to master (and check it out)
git checkout -b bug_fix // Create branch and check out to it (currently pointing to the same commit as master)
// Do some work...
git add FILE_TO_CHANGE
git commit -m 'Bug fix for f95ecfe (Plus more details, obviously)'
git pull --rebase origin master // Pull latest code, try to rebase on top of it
git checkout master
git merge bug_fix // fast-forward merge master onto bug_fix branch
git push origin master // push master
git branch -d bug_fix // delete the temporary local branch

分支大师

分支母版可以让您更清楚地看到哪些提交是相关的,但这意味着它看起来可能非常混乱。不过有些人更喜欢这种方法。

工作流程将类似于:

git pull origin master
git checkout f95ecfe // Move head to f95ecfe (note: HEAD is no longer on a branch! - just a commit)
git checkout -b bug_fix // Create branch at the current position and check out to it (branch is pointing to f95ecfe)
// Do some work...
git add FILE_TO_CHANGE
git commit -m 'Bug fix for f95ecfe (Plus more details, obviously)'
git pull origin master // Pull latest code. ALSO merges onto master.
// Alternatively could do:
git merge master

git checkout master // Now we need to bring master up to where we are
git merge bug_fix // fast-forward master onto the bug_fix merge
git push origin master // push master
git branch -d bug_fix // delete the temporary local branch

如果你真的很想回到过去强制master

如果你只是编辑 master 并且你想回到过去更改提交,并在 master 上更改它,请执行以下操作:

git checkout f95ecfe
git checkout -b 'bug_fix' // It's nicer to have your head attached to a branch. So create a branch at this point

// Make some changes
git commit --amend 'Message'

现在您需要将所有其他提交添加到您当前所在的位置。有很多方法可以做到这一点。就个人而言,我更喜欢通过 git gui 使用 cherry-pick 命令来逐步执行此操作,而不是进行大规模的 rebase。但最干净的做法是将 master 变基到 bug_fix 上,如下所示:

git checkout master
git rebase --onto bug_fix f95ecfe // Put the commits from (but not including) f95ecfe up to master, on top of bug_fix

然后您应该在 git gui 中检查所有内容,然后您可以推送:

git push -f origin master

注意:如前所述,这是 FORCED 推送 -f。如果其他人在他们的机器上有 master 分支的副本,请不要这样做,因为这会使他们的副本不一致,并给他们带来很多痛苦,因为他们必须重新设置所有更改并修复他们的本地 master。

PS:这部分有很多种方法,我给出我认为最简单的方法(在它使用更基本的命令的意义上)。备选方案包括在 master 之上进行提交(根据线性 master 说明),然后使用 git rebase -i(交互模式)对提交重新排序 <- 这可能是最自然的方式。