昨天我创建了一个github存储库,今天我发现我的顾问也创建了一个github存储库。 将我的存储库添加到他的存储库而不会大量搞砸事情的最佳方法是什么? 我过去把事情搞砸了,所以我只想确定一下。 此外,我可能已经通过尝试按照另一个 StackOverflow 帖子上的说明将事情搞砸了。
现在似乎我有两个分支,键入"git checkout master"给了我我的文件,而键入"git checkout tmp_branch"给了我他的文件。 我想将所有文件添加到他的存储库并从现在开始使用该文件库,也许还可以删除我的存储库。
到目前为止,我试图做的是
me@server:~/rootdir$ git remote add origin https://github.com/him/his_repo.git
fatal: remote origin already exists.
me@server:~/rootdir$ git remote add his_repo https://github.com/him/his_repo.git
me@server:~/rootdir$ git push -u his_repo master
Username for 'https://github.com': me@gmail.com
Password for 'https://me@gmail.com@github.com':
To https://github.com/him/his_repo.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/him/his_repo.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
me@server:~/rootdir$ git pull his_repo
Username for 'https://github.com': me@gmail.com
Password for 'https://me@gmail.com@github.com':
warning: no common commits
remote: Counting objects: 13, done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 13 (delta 0), reused 10 (delta 0)
Unpacking objects: 100% (13/13), done.
From https://github.com/him/his_repo
* [new branch] master -> his_repo/master
You asked to pull from the remote 'his_repo', but did not specify
a branch. Because this is not the default configured remote
for your current branch, you must specify a branch on the command line.
me@server:~/rootdir$ git checkout -b tmp_branch his_repo/master
warning: unable to rmdir mysubdir: Directory not empty
Branch tmp_branch set up to track remote branch master from repo.
Switched to a new branch 'tmp_branch'
me@server:~/rootdir$ git checkout -b origin/master
Switched to a new branch 'origin/master'
me@server:~/rootdir/subdir$ git checkout -b master
fatal: A branch named 'master' already exists.
me@server:~/rootdir/subdir$ git checkout master
Checking out files: 100% (2409/2409), done.
Switched to branch 'master'
me@server:~/rootdir$ git checkout tmp_branch
warning: unable to rmdir mysubdir: Directory not empty
Switched to branch 'tmp_branch'
me@server:~/rootdir$ git mv * tmp_branch/*
fatal: destination 'tmp_branch/*' is not a directory
me@server:~/rootdir$ cd ..
me@server:~/rootdir$ git checkout master
Checking out files: 100% (2409/2409), done.
Switched to branch 'master'
me@server:~/rootdir$ git push -u tmp_branch master
fatal: 'tmp_branch' does not appear to be a git repository
fatal: The remote end hung up unexpectedly
me@server:~/rootdir$ git push -u his_repo master
Username for 'https://github.com': me@gmail.com
Password for 'https://me@gmail.com@github.com':
To https://github.com/him/his_repo.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/him/his_repo.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
非常感谢:)
要使顾问的仓库包含您的文件,并忘记您的仓库:
- 将他的存储库添加为另一个远程
- 查看跟踪其主分支的新本地分支
- 在该分支上进行新的提交,将他的文件替换为您的文件
- 将该分支推到他的遥控器
- 从本地存储库中删除旧的远程数据库(如果需要,可以在远程服务器上删除它(
在 shell 命令日志中,您已经获得了步骤 1 和 4 的工作。步骤 4 失败,因为您未执行步骤 2 和 3。当您尝试在步骤 4 中将提交历史记录推送到他的远程时,您位于旧存储库的分支上,该分支具有完全不同的历史记录。Git 拒绝这样做,因为你会用你的历史覆盖他的所有历史。要解决此问题,请从他的历史记录开始,签出他的分支,然后在历史记录中添加一个新的提交,将他的文件替换为您的文件。
我还没有记住执行上述所有操作的确切git
命令 - 我通常使用GUI - 但以下是我对每个步骤的了解:
-
git remote add his_repo https://github.com/him/his_repo.git
-
git branch branch_for_his_work his_repo/master
,其次是git checkout --merge branch_for_his_work
。这将切换到跟踪他的存储库的分支,--merge
意味着 Git 不会用他的文件覆盖您的工作副本的文件,而是开始三向合并。
要用你的文件覆盖他的文件, - 请解决合并问题,以便只暂存你的文件,而不暂存他的文件。然后
git commit …
. -
git push …
-
git remote remove origin
,也git remote rename his_repo origin
是否要称呼他的远程"原点"而不是"his_repo"。可能还会git branch -M branch_for_his_work master
,因此"主人"是您唯一的分支,并指的是您的顾问的历史。
步骤 2 和 3 比它们需要的要难一些,因为我不知道git checkout
有任何标志意味着"完全保持工作副本原样 - 只需更改 Git 的HEAD
"。如果有这样的标志,您可以在步骤 3 中git add -A
和git commit
,而无需处理合并冲突。或者,您可以在步骤 2 之前复制文件,然后在步骤 3 之前将它们放回原处,这会占用更多磁盘空间,但更简单,就像您所说的手动解决方案一样。
听起来您可能会将存储库与分支混淆:
现在似乎我有两个分支,键入"git checkout master"给了我我的文件,而键入"git checkout tmp_branch"给了我他的文件。
如果你的评论是正确的,你实际上没有单独的存储库,只是在同一存储库上单独的分支 - 这使得这非常容易修复。如果你想将你的分支合并到他的分支中,然后继续从他的分支中工作,只需这样做:
git checkout tmp_branch
git merge origin master
这就是它的全部内容! :-(
但是,这里还值得一提的是,您可能不想与他的分支在同一个分支上工作。如果你实际上正在处理相同的任务,这可能是你想要做的,但通常开发人员正在处理不同的任务。因此,例如,如果您正在研究用户身份验证,而您的老板正在为管理员添加一些功能,您可能希望他在一个名为"admin">的分支上,而您可能在一个名为"user-auth">的分支上。
对不起,另一个注意事项 - 通常当你与一个开发团队一起做某事时,你也永远不会直接在主分支上工作。最好在自己的分支上进行开发,并且只有在新代码经过测试并正常工作后,才将其合并到主分支中以将其部署到生产环境中。仅供参考:-(。