我认为您的基本问题是您误解和/或误解了git的作用以及为什么这样做。
当您克隆其他存储库时,git会复制“那里”的任何内容。它也需要“自己的”分支的标签,比如master
,使该标签在其“全名”的副本,你的git树(正常)remotes/origin/master
(但在你的情况下,remotes/upstream/master
)。大多数时候,您也可以省略remotes/
零件,因此您可以将原始副本称为upstream/master
。
如果您现在对某些文件进行一些更改并将其提交,那么您将是仅有的那些更改。同时,其他人可能会使用原始存储库(从中创建克隆)来创建其他克隆并更改这些克隆。当然,他们是唯一具有更改的人。最终,某人可能会有更改,他们会将更改发送回原始所有者(通过“推送”或补丁或其他方式)。
该git pull
命令主要是的缩写,git fetch
后跟git merge
。这很重要,因为这意味着您需要了解这两个操作的实际作用。
的 git fetch
命令说,可以返回到您从其克隆的任何位置(或以其他方式设置为从其获取的位置)并找到“其他人添加或更改或删除的新内容”。这些更改将被复制并应用于您之前从中获得的内容的副本。他们不是用于您自己的作品,仅适用于您的作品。
该git merge
命令更加复杂,您将在哪里出错。简单地说,它所做的是将“您在副本中所做的更改”与“从其他人那里获取的更改,并因此添加到您的其他人的副本中”进行比较。如果您的更改及其更改似乎没有冲突,那么该merge
操作会将它们混合在一起,并为您提供一个“合并提交”,将您的开发及其开发联系在一起(尽管在非常简单的情况下,您没有变化,您将获得“快速前进”)。
您现在所遇到的情况是您进行了更改并做出了更改(实际上是九次,因此是“提前9”),并且他们没有做出任何更改更改。因此,fetch
尽职尽责不获取任何东西,然后merge
接受他们的零钱,也什么也不做。
您想要的是查看代码,甚至“重置”其“代码”版本。
如果您只想看一下,可以简单查看该版本:
git checkout upstream/master
这告诉git您想将当前目录移动到其全名实际上是的分支remotes/upstream/master
。您将在上次运行时看到他们的代码git fetch
并获得他们的最新代码。
如果您要放弃所有自己的更改,则需要做的就是更改git的标签master
(应该命名)的想法。当前,它命名您的最新提交。如果回到该分支:
git checkout master
那么该git reset
命令将允许您像以前一样“移动标签”。剩下的唯一问题(假设您已经准备好放弃自己所做的一切)是找到标签应该指向的位置。
git log
可以让您找到数字名称(例如类似的数字)7cfcb29
,它们是永久性的(永不更改)名称,并且还有很多其他方式来命名它们,但是在这种情况下,您只想要名称upstream/master
。
要移动标签,消灭自己的更改(任何你犯是相当长的,而实际上可恢复的,但它在这之后要困难得多,所以要非常肯定):
git reset --hard upstream/master
该--hard
告诉的Git消灭你一直在做什么,将当前分支标签,然后检查了指定的提交。
真正想要git reset --hard
并消灭大量工作并不罕见。一种更安全的方法(如果您认为其中的某些事情值得,那么使恢复工作容易得多)是重命名现有分支:
git branch -m master bunchofhacks
然后创建一个新的本地分支,命名为master
“ tracks”(我不太喜欢这个术语,因为我认为它会使人们感到困惑,但这是git术语:-))。
git branch -t master upstream/master
然后,您可以使用以下方法:
git checkout master
最后三个命令的作用(有一些快捷方式使它仅是两个命令)是更改粘贴在现有标签上的名称,然后创建一个新标签,然后切换到它:
在做任何事情之前:
C0 - "remotes/upstream/master"
\
\- C1 --- C2 --- C3 --- C4 --- C5 --- C6 --- C7 --- C8 --- C9 "master"
之后git branch -m
:
C0 - "remotes/upstream/master"
\
\- C1 --- C2 --- C3 --- C4 --- C5 --- C6 --- C7 --- C8 --- C9 "bunchofhacks"
之后git branch -t master upstream/master
:
C0 - "remotes/upstream/master", "master"
\
\- C1 --- C2 --- C3 --- C4 --- C5 --- C6 --- C7 --- C8 --- C9 "bunchofhacks"
这C0
是您第一次执行时获得的最新提交(完整的源代码树)git clone
。C1到C9是您的提交。
请注意,如果您之前选择git checkout bunchofhacks
,然后git reset --hard HEAD^^
将更改为:
C0 - "remotes/upstream/master", "master"
\
\- C1 --- C2 --- C3 --- C4 --- C5 --- C6 --- C7 - "bunchofhacks"
\
\- C8 --- C9
原因是HEAD^^
将修订版本从当前分支的开头(重置之前为bunchofhacks
)的名称命名为两个,reset --hard
然后移动标签。提交C8和C9现在几乎是不可见的(您可以使用reflog之类的东西git fsck
来查找它们,但不再琐碎了)。您可以随意移动标签。该fetch
命令负责以开头的命令remotes/
。通常将“您的”与“他们的”匹配(因此,如果他们也有一个remotes/origin/mauve
您自己的名字mauve
),但是只要您要命名/查看您从“他们”那里得到的提交,就可以键入“他们”。(请记住,“一次提交”是整个源代码树。您可以从一次提交中选择一个特定的文件,git show
例如,