我有一个奇怪的问题。我已经在本地完成以下操作:
git init
git remote add [git repository]
git pull origin master
效果很好 现在,当我需要添加一些更改并进行推送时,它给了我这个错误:
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin master
我按照它说的做,git push --set-upstream .....,它把这个错误扔给了我:
To [git repo]
! [rejected] master -> master (fetch first)
error: failed to push some refs to '[git repo]'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
现在这不可能发生,因为我是唯一从事此工作的人,在本地进行更改之前我做了一次拉动。
编辑:谢谢大家,我确实在拉出后从远程存储库中删除了一个文件。我又做了一次拉动,再次进行了更改,然后顺利地将其推入。
答案 0 :(得分:1)
这里发生的是git认为本地存储库的历史记录与远程存储库的历史记录不同。如果您深入研究git的实际工作方式,那么它不太可能是错误的,因此我猜测是自从您运行了最后一个git pull
命令以来,您已经在远程存储库中进行了更改。
这句话证实了这一点:
编辑:谢谢大家,我确实在拉出后从远程存储库中删除了一个文件。我又做了一次拉动,再次进行了更改,然后顺利地将其推入。
由于您现在已经知道原因,因此您意识到可以通过仅在知道远程控制器未更改的情况下进行本地更改来避免此问题,但这听起来并不是一个很好的工作流程,尤其是当多个人们正在使用存储库。此外,git的优点之一是多个人可以同时在同一个存储库上工作,并且所有人都可以推送到同一个远程存储库。
让我们看看您现在可以使用哪些命令来更好地处理此问题:
fetch
您始终可以安全地fetch
从远程存储库进行更改,而不会影响您的工作副本或本地分支。这会将新的历史记录从远程存储库下载到所谓的“跟踪分支”,但不会将其应用于您的任何本地分支,也不会影响您的“工作副本”。
merge
合并将尝试将另一个分支中的更改应用于您所在分支的头部。它可以在本地分支之间使用,或将更改从跟踪分支合并到本地分支。但是,它使用“合并提交”来实现,从而允许非线性历史记录。 Git对此没有任何问题,并且在小剂量情况下,人类通常也不会对它感到困扰:
但是,您做得越多,历史就越复杂,随着复杂性的增加,单纯的人类可能很难追踪事物:
pull
rebase
这是一种重写历史记录的形式。基本上,您是将更改从一个分支合并到另一个分支,但是与常规合并不同,您不只是将两个分支捆绑在一起并称其为好,而是在两个分支之后取走对一个分支所做的更改分支拆分,应用另一个分支的更改,然后重新应用您所做的更改,留下一个很好的线性历史记录。
之前:
之后:
pull --rebase
此操作(如常规的pull
)使用fetch
来获取远程更改,但是它没有执行merge
,而是执行了rebase
,因此您当您回顾完成的操作时,可以轻松使用仅需运行一个命令的操作,并且还拥有良好的线性历史记录。
[此答案中的所有图像也是我从那里获得图像的链接。]