服务器A上已有代码,并且和本地机器B代码不一致,想建立连接,将服务器A代码,同步到B上,同时本地机C 也想考一份稳定版本的代码用于开发,以后B和C在本地开发稳定之后,再将稳定版本push到A上
假设放置中转仓库的目录是/home/a/git/repo
,服务器A工作目录的为/home/a/code
,IP是1.1.1.1
用户名是a
# 建立服务器A本机的仓库
cd /home/a/code
git init
git add -A # 见解释
git commit -m "init repo"
# 建立中转仓库
cd /home/a/git/repo
#执行完之后 /home/a/git/repo下会生成一个code.git的目录,这是code的裸仓库
git clone --bare /home/a/code
一些解释:
为何要使用中转仓库?
--bare
参数表示clone的是个裸仓库,这个仓库文件夹里只有.git里的版本信息,没有代码。据说通过这样的方式可以避免A正在coding时,其他工作者突然推送代码导致A的本地代码发生冲突,所有工作者都只与中转仓库建立联系,这样冲突只会发生在中转仓库,各机本地代码不会冲突。
git add -A
啥意思?
git add -A
表示使暂存区和工作区保持一致,即添加所有内容到暂存区
git add .
表示添加新文件和修改文件但不包括删除的文件
git add -u
表示添加修改文件和删除文件,不包括新文件(未跟踪的)
注意git add不支持添加空问文件夹,得放个假文件.gitkeep占位
假设对于A本地仓库来说,中转仓库我们给它起名字叫wokao
,当然 其实这里的wokao
并不是中转仓库名,而是中转仓库和A本地仓库的远程连接叫wokao
# 为A本地仓库添加远程连接
cd /home/a/code
git remote add wokao /home/a/git/repo/code.git
现在A的工作流程就是:
coding-> git add ->git commit ->git pull->solve conflict -> git add ->git commit ->git push
一些解释:
git remote
一些其他用法:
git remote -v
列出其他仓库和本地仓库的远程连接
git remote rm wokao
删掉对于A来所名字叫wokao
远程连接
git remote rename wokao haoshuai
将名字为wokao
的远程连接改名叫haoshuai
假设这个远程连接名字叫niubi
,B机器的本地代码目录为/home/b/code
,没有本地仓库的话先按照1中一样建立本地仓库。
# 建立和A上中转仓库远程连接,假设A,IP是1.1.1.1,用户名是a
git remote add niubi ssh://a@1.1.1.1:/home/a/git/repo/code.git
# 看下远程连接情况
git remote -v
理论上输出:
niubi ssh://a@1.1.1.1:/home/a/git/repo/code.git(fetch)
niubi ssh://a@1.1.1.1:/home/a/git/repo/code.git(push)
# 更新B上代码并合并B和中转仓库历史
git pull niubi master --allow-unrelated-histories
此时若是B仓库中本来就有文件名字和A中一样,但是内容不同,就会起冲突,使用git status
查看,手动coding解决冲突之后,再git add
和git commit
就行,最后再git pull
没啥冲突就可以push了
现在B的工作流程就是:
git pull->solve confict->coding-> git add ->git commit ->git pull->solve conflict -> git add ->git commit ->git push
一些解释:
--allow-unrelated-histories
# 通过A中转仓库clone代码
git clone ssh://a@1.1.1.1:/home/a/git/repo/code.git
# C coding
# C git add |git commit |git pull |git push
git status
确保工作区干净