git push在Windows上需要“--force”,而不是ubuntu,新创建的存储库

时间:2014-02-21 04:55:10

标签: windows git ubuntu github

我在github.com上创建了一个新的存储库。我在Windows 7上安装了git版本1.8.4。我使用git bash进行git相关的操作。我通过

在一个空文件夹中初始化了git
git 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命令时,它就可以工作了。我的问题是在这种情况下为什么我需要强制选项?

1 个答案:

答案 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

在这里,您可能希望合并HF,然后推送。但大多数情况下,您不想只推送F,因为它会覆盖H

所以git告诉你“要小心,有些事情发生了,可能会导致数据丢失。但如果你知道自己在做什么,请继续强行”。

如果你git push -f origin master,Git会相信你知道你做了什么,服务器最终会像

一样
    A -- B -- C -- D -- E -- F
                             L master

即:提交GH或多或少都会丢失。

<强>结论

无论您是在Windows上还是在ubuntu上都没关系:您可能需要根据您的本地和远程存储库强制执行。不是你的操作系统。

“技术”一词将是:只有在远程仓库中产生fast-forward时才能推送。您可能希望在http://git-scm.com/book/ch3-2.html上搜索此单词以便更好地理解。