为什么Git说我的主分支是;“已更新”;即使不是? 基本问题
我只是删除了我项目中一个文件中的所有代码,并将更改提交到本地git(有意)。是的 从上游获取和合并(理论上,删除的代码应该返回) Git告诉我一切都是最新的 一切都不是最新的——所有被删除的代码仍然被删除 其他相关信息 我只有一个分支叫做“大师” 我最近设置了“master”来跟踪上游,如下所示: 分支主机设置为从上游跟踪远程分支主机 命令为什么Git说我的主分支是;“已更新”;即使不是? 基本问题,git,github,merge,Git,Github,Merge,我只是删除了我项目中一个文件中的所有代码,并将更改提交到本地git(有意)。是的 从上游获取和合并(理论上,删除的代码应该返回) Git告诉我一切都是最新的 一切都不是最新的——所有被删除的代码仍然被删除 其他相关信息 我只有一个分支叫做“大师” 我最近设置了“master”来跟踪上游,如下所示: 分支主机设置为从上游跟踪远程分支主机 命令git branch-vv生成: * master 7cfcb29 [upstream/master: ahead 9] deletion test 为什么
git branch-vv
生成:
* master 7cfcb29 [upstream/master: ahead 9] deletion test
为什么会这样?我即将通过电子邮件向我的项目经理发送我对代码所做的任何更改
更新
我认为这是显而易见的,但无论如何,这是我的目标:
获取我系统上的最新代码。
请原谅我的愤怒,但为什么这么简单的任务这么难呢?您所做的任何更改,如删除所有项目文件,都将在拉取后保留。拉操作所做的只是将其他地方的最新更改合并到您自己的分支中,如果您的分支删除了所有内容,那么当上游更改影响您删除的文件时,您最多也会遇到合并冲突。总之,是的,一切都是最新的 如果你描述了你想要的结果,而不是“删除所有文件”,也许有人可以建议采取适当的行动 更新: 获取系统上的最新代码 您似乎不明白的是,您已经有了最新的代码,这是您的。如果您真正想要的是查看其他人在主分支上的最新作品,只需执行以下操作:
git fetch upstream
git checkout upstream/master
请注意,这不会让您立即(重新)开始自己的工作。如果您需要知道如何撤消您所做的操作或以其他方式还原您或其他人所做的更改,请提供详细信息。此外,考虑阅读什么版本控制,因为你似乎误解了它的基本目的。 < P>正如其他海报所说的,将合并从上游变为你的存储库。如果您想用上游中的内容替换存储库中的内容,您有几个选项。即兴表演,我会和你一起去
git checkout HEAD^1 # Get off your repo's master.. doesn't matter where you go, so just go back one commit
git branch -d master # Delete your repo's master branch
git checkout -t upstream/master # Check out upstream's master into a local tracking branch of the same name
我认为您在这里的基本问题是您误解和/或误解了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
——它们是永久(永不更改)的名称,还有许多其他方法可以让您
git checkout master
git reset --hard upstream/master
git branch -m master bunchofhacks
git branch -t master upstream/master
git checkout master
C0 - "remotes/upstream/master"
\
\- C1 --- C2 --- C3 --- C4 --- C5 --- C6 --- C7 --- C8 --- C9 "master"
C0 - "remotes/upstream/master"
\
\- C1 --- C2 --- C3 --- C4 --- C5 --- C6 --- C7 --- C8 --- C9 "bunchofhacks"
C0 - "remotes/upstream/master", "master"
\
\- C1 --- C2 --- C3 --- C4 --- C5 --- C6 --- C7 --- C8 --- C9 "bunchofhacks"
C0 - "remotes/upstream/master", "master"
\
\- C1 --- C2 --- C3 --- C4 --- C5 --- C6 --- C7 - "bunchofhacks"
\
\- C8 --- C9
$ git checkout upstream master
$ git branch -d <branch_name>
$ git checkout -b <new_branch_name>
git fetch --all
git reset --hard origin/master
git checkout your_branch_name_here
git reset --hard origin/your_branch_name_here
cat .gitignore