这是我参与 [第五届青训营] 伴学笔记创作活动的第16天
项目合作需要Git与远程仓库相关操作,以下是整理笔记
注:以下
git-log为git log --pretty=oneline --all --graph --abbrev-commit别名alias git-log='git log --pretty=oneline --all --graph --abbrev-commit'
1.关联远程仓库(remote)
首先初始化本地仓库,然后 git remote add <远端名称> <仓库路径>,新建关联
git init
git remote add origin https://github.com/OaksHeaven/simple_test.git
git remote
git remote add 内部做的工作就是往 .git/config 中写入了一个叫 [remote "origin"] 配置:
[remote "origin"]
url = https://github.com/OaksHeaven/simple_test.git
fetch = +refs/heads/*:refs/remotes/origin/*
2.克隆(clone)
git clone指令可以直接克隆远程仓库到本地——一般运行后会出现登录界面
- 指令:git clone <仓库路径> [本地目录]——本地目录可省略
# -b 选项可以指定克隆的分支——不过指定后只有这一个分支了,一般不使用
# git clone -b main https://github.com/OaksHeaven/simple_test.git
git clone https://github.com/OaksHeaven/simple_test.git
- 其中 origin/HEAD指向远程的默认分支,即origin/main
3.推送(push)
`git push,将本地某分支推送到远程仓库某分支:在push前要先pull仓库,保证远程仓库与本地仓库
-
命令:git push [-f] [–set-upstream] [远端名称 [本地分支名] [:远端分支名] ]
-
参数解释:
-
-f:强制覆盖;一般远端仓库都只准添加、不准覆盖,所以一般没用
-
–set-upstream:推送的同时建立远程操作关联关系
- 如果当前分支已经和远端分支关联,则可以省略分支名和远端名:git push remote
-
[本地分支名] [:远端分支名]:将决定往远程分支推送哪个本地分支
- 例如 git push remote main : dev 表示将 main推送到 dev上
- 若分支名称相同,可以只写本地分支:git push remote main
-
-
查看分支关联情况: git branch -vv
使用–set-upstream后才能建立关联
4.抓取&拉取(fetch & pull)
4.1fetch
抓取指令就是将仓库里的更新都抓取到本地,不会进行合并
-
指令:git fetch [remote name] [branch name]
#此时origin为 https://github.com/OaksHeaven/simple_test.git git fetch origin main git merge origin/main git-log -
如果不指定分支名则会抓取所有 和本地关联的 远端分支——若没有关联则默认抓取同名分支
4.2pull
拉取指令就是将远端仓库的修改拉到本地并自动进行合并,等同于fetch+merge
-
指令:git pull [remote name] [branch name]
#此时origin为 https://github.com/OaksHeaven/simple_test.git git pull origin main git-log -
如果不指定分支名则会拉取所有 和本地关联的 远端分支——若没有关联则默认拉取同名分支
5.远程解决冲突
- 当A与B都向远程仓库推送更新,并且更新了同一个文件,就可能造成冲突——这时本地和远程仓库会报错
- 解决的思路主要是:拉取远程合并的目标分支到本地开发分支上来,在本地进行冲突处理,然后再提交到远程开发分支上
5.1冲突发生
-
#A的提交 vim test1.txt git add . git commit -m "A chanegs the test1" git-log #推送前 git push origin main:main git-log #推送后 可以看到远程仓库与本地仓库同步了 -
#B的提交 vim test1.txt git add . git commit -m "B chanegs the test1" git-log #推送前 git push origin main:main git-log #推送后报错!!! 远端冲突:
5.2冲突解决
先将远程仓库pull到本地,然后使用之前记录过的合并冲突办法
git pull origin main
# 警告:
#Auto-merging test1.txt
#CONFLICT (content): Merge conflict in test1.txt
#Automatic merge failed; fix conflicts and then commit the result.
vim test1.txt
git add .
git commit -m "solve the origin conflicts"
git-log #推送前
git push origin master:main
git-log #推送后
-
冲突文件:
-
推送前:
-
推送后:
注意: 有权限的用户push会强制覆盖远端仓库,所以一定要在push前先pull!在本地解决冲突
5.?其他冲突——远程仓库与本地仓库不一致
原因:远程库和本地库不一致。通常出现在初始化仓库有readme而本地没有等情况。
error: failed to push some refs to 'https://github.com/OaksHeaven/simple_test.git'
解决办法:
git pull -–rebase origin master 操作,–-rebase的作用是取消掉本地库中刚刚的commit,并且把它们临时保存为补丁(patch)(这些补丁在”.git/rebase”目录中),之后同步远程库到本地,最后合并补丁到本地库之中。
总结
git关联远端github仓库可以做到代码在线版本管理,需要学习git克隆、拉取(获取并合并)仓库、向远端仓库推送更新等等操作;并时刻注意仓库合并冲突以及及时解决冲突