Git 分支并重置 master 的头部

Git branching and reset head of master

Git

步骤-1:我在本地机器上对 master 分支做了一些未提交的更改。

步骤-2:后来我决定为这些更改创建单独的分支,因为我注意到这些更改要大得多并且已成为一项功能。

步骤-3:我创建了一个分支切换到那个分支进行了我的更改。

第 04 步:现在我想将我新创建的分支合并到 master,但我在 master 中仍然有几个未提交,我试图重设我的 origin/master 分支和我所有新的分支更改和master 分支更改消失了:(

我还注意到我在新创建的分支中所做的任何更改它们也出现在 master 分支中。

我以为local branch和master是unsync branch。请帮助我理解为什么会发生这种情况的概念。

"Syncing" B运行ches

当您创建并签出 new b运行ch 时,git 会带来您当前的工作目录和索引。所以在这一点上,masternew还是一样的。

当您投入 new 时,它会偏离 master。您提交到 new 的内容不会提交到 master。它们不同步。

就是说,如果您有未跟踪的文件并且在 new b运行ch 上对它们进行了更改,那么无论您是否在masternew b运行ch。切换 b运行ches 不会影响未跟踪的文件 - 它们看起来是同步的。

这可以解释为什么你经历了 "syncing" 之间。也许同步是未跟踪的文件。如果在 new 中进行了十几次提交后你检出 master,工作目录将仍然有任何未跟踪的文件及其更改。

重置

当您 运行 reset 时,git 不会破坏您的提交。相反,它将 HEAD 和您的 current b运行ch 移动到您指定的提交。例如,如果您在 new b运行ch 上进行了十几个提交,然后 - 同时仍在 new b运行ch - 运行 git reset --hard origin/master,你的 new b运行ch 和 HEAD 现在会指向 origin/master。结果:您的工作目录将仅包含 origin/master 中的内容,并且任何未跟踪的文件可能已经存在。看起来您已经丢失了在 new.

上所做的所有提交

重要的是,您没有丢失您的提交。

您可以使用 reflog 查看提交。试试这个:

git reflog -10

这将列出 HEAD 指向的最后十次提交。它看起来像这样。

ok5073x HEAD@{0}: reset: moving to origin/master
fc5773d HEAD@{1}: commit: Some message
3b50d9f HEAD@{2}: commit: Some message
1ab5125 HEAD@{3}: commit: Some message
15bee3e HEAD@{4}: checkout: moving from master to new
94ccc72 HEAD@{5}: commit: Some message
30276c1 HEAD@{6}: commit: Some message
15bee3e HEAD@{7}: checkout: moving from new to master
36857b6 HEAD@{8}: commit: Some message
b9f0af5 HEAD@{9}: commit: Some message
17ue83e HEAD@{2}: checkout: moving from master to new

如果您想 return 到重置和恢复提交之前的位置,您可以通过 运行ning 检出您以前的 HEAD 位置之一:

git checkout 3b50d9f

git checkout HEAD{1}

这可能会拯救你。