我在github.com上创建了一个新的存储库。我在Windows 7上安装了git版本1.8.4。我使用git bash进行git相关的操作。我通过
在一个空文件夹中初始化了gitgit init
命令。然后我通过命令
添加了远程原点git remote add origin <repo url>
然后我通过命令
获取了存储库git fetch origin
我添加了一些文件,然后通过git add命令将它们编入索引。然后我使用
提交了文件git commit -m "commit message"
命令。然后我试着推动使用 git push 命令,我得到了以下错误。
$ git push origin master
Username for 'https://github.com': Gaurav3khede
Password for 'https://Gaurav3khede@github.com':
To https://github.com/Gaurav3khede/TestRepo.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/Gaurav3khede/TestRepo.git
'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. Check out this branch and 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.
当我的朋友在Ubuntu上尝试过同样的事情时,它工作正常。
tarun:~/java_workspace/git_prac_g$ ls
tarun:~/java_workspace/git_prac_g$ git init
Initialized empty Git repository in /home/tarun/java_workspace/git_prac_g/.git/
tarun:~/java_workspace/git_prac_g$ git remote add origin https://github.com/c2tarun/gaurav_test.git
tarun:~/java_workspace/git_prac_g$ git fetch origin
tarun:~/java_workspace/git_prac_g$ git branch
tarun:~/java_workspace/git_prac_g$ ls
tarun:~/java_workspace/git_prac_g$ echo "first file" >> Firstfile.txt
tarun:~/java_workspace/git_prac_g$ ls
Firstfile.txt
tarun:~/java_workspace/git_prac_g$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# Firstfile.txt
nothing added to commit but untracked files present (use "git add" to track)
tarun:~/java_workspace/git_prac_g$ git add .
tarun:~/java_workspace/git_prac_g$ git commit -m "first commit"
[master (root-commit) d6dec54] first commit
1 file changed, 1 insertion(+)
create mode 100644 Firstfile.txt
tarun:~/java_workspace/git_prac_g$ git push origin master
Username for 'https://github.com': abc@abcmail.com
Password for 'https://abc@abcmail.com@github.com':
To https://github.com/c2tarun/gaurav_test.git
* [new branch] master -> master
tarun:~/java_workspace/git_prac_g$
现在当我在Windows上尝试使用--force选项的push命令时,它就可以工作了。我的问题是在这种情况下为什么我需要强制选项?
答案 0 :(得分:0)
为什么您通常不需要强制
假设您在服务器上有以下提交
A -- B -- C
L master
如果您克隆此repo并添加一些提交,您最终会在本地仓库中以
结束A -- B -- C -- D ---- E ---- F
L origin/master L master
在这里,你没有问题,在git push origin master
之后,服务器上的repo看起来像
A -- B -- C -- D -- E -- F
L master
为什么你可能需要强制
另一方面,想象别人在你面前推了一些提交。然后你可以:
在服务器上:
A -- B -- C -- D -- G -- H
L master
如果你拿到,你将拥有当地的回购:
A -- B -- C -- D -- G -- H
\ L origin/master
\
\- E -- F
L master
在这里,您可能希望合并H
和F
,然后推送。但大多数情况下,您不想只推送F
,因为它会覆盖H
。
所以git告诉你“要小心,有些事情发生了,可能会导致数据丢失。但如果你知道自己在做什么,请继续强行”。
如果你git push -f origin master
,Git会相信你知道你做了什么,服务器最终会像
A -- B -- C -- D -- E -- F
L master
即:提交G
和H
或多或少都会丢失。
<强>结论强>
无论您是在Windows上还是在ubuntu上都没关系:您可能需要根据您的本地和远程存储库强制执行。不是你的操作系统。
“技术”一词将是:只有在远程仓库中产生fast-forward
时才能推送。您可能希望在http://git-scm.com/book/ch3-2.html上搜索此单词以便更好地理解。