Git远程操作 | 青训营笔记

128 阅读4分钟

这是我参与 [第五届青训营] 伴学笔记创作活动的第16天

项目合作需要Git与远程仓库相关操作,以下是整理笔记

注:以下git-loggit 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

23.jpg

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
  • 22.jpg

3.推送(push)

`git push,将本地某分支推送到远程仓库某分支:在push前要先pull仓库,保证远程仓库与本地仓库

  • 命令:git push [-f] [–set-upstream] [远端名称 [本地分支名] [:远端分支名] ]

  • 参数解释:

    1. -f:强制覆盖;一般远端仓库都只准添加、不准覆盖,所以一般没用

    2. –set-upstream:推送的同时建立远程操作关联关系

      1. 如果当前分支已经和远端分支关联,则可以省略分支名和远端名:git push remote
    3. [本地分支名] [:远端分支名]:将决定往远程分支推送哪个本地分支

      1. 例如 git push remote main : dev 表示将 main推送到 dev上
      2. 若分支名称相同,可以只写本地分支:git push remote main
  • 查看分支关联情况: git branch -vv

    使用–set-upstream后才能建立关联

    24.jpg

4.抓取&拉取(fetch & pull)

4.1fetch

抓取指令就是将仓库里的更新都抓取到本地,不会进行合并

  • 指令:git fetch [remote name] [branch name]

    #此时originhttps://github.com/OaksHeaven/simple_test.git
    git fetch origin main
    git merge origin/main
    git-log
    

    24_2.jpg

  • 如果不指定分支名则会抓取所有 和本地关联的 远端分支——若没有关联则默认抓取同名分支

4.2pull

拉取指令就是将远端仓库的修改拉到本地并自动进行合并,等同于fetch+merge

  • 指令:git pull [remote name] [branch name]

    #此时origin为 https://github.com/OaksHeaven/simple_test.git
    git pull origin main
    git-log
    

    25.jpg

  • 如果不指定分支名则会拉取所有 和本地关联的 远端分支——若没有关联则默认拉取同名分支

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 #推送后 可以看到远程仓库与本地仓库同步了
    

    26.jpg

    27.jpg

  • #B的提交
    vim test1.txt
    git add .
    git commit -m "B chanegs the test1"
    git-log #推送前
    git push origin main:main
    git-log #推送后
    

    报错!!! 远端冲突:

    28.jpg

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 #推送后
  1. 冲突文件:

    29.jpg

  2. 推送前:

    29_2.jpg

  3. 推送后:

    29_3.jpg

注意: 有权限的用户push会强制覆盖远端仓库,所以一定要在push前先pull!在本地解决冲突

5.?其他冲突——远程仓库与本地仓库不一致

原因:远程库和本地库不一致。通常出现在初始化仓库有readme而本地没有等情况。

error: failed to push some refs to 'https://github.com/OaksHeaven/simple_test.git'

30.jpg

解决办法:

git pull -–rebase origin master 操作,–-rebase的作用是取消掉本地库中刚刚的commit,并且把它们临时保存为补丁(patch)(这些补丁在”.git/rebase”目录中),之后同步远程库到本地,最后合并补丁到本地库之中。

31.jpg

总结

git关联远端github仓库可以做到代码在线版本管理,需要学习git克隆、拉取(获取并合并)仓库、向远端仓库推送更新等等操作;并时刻注意仓库合并冲突以及及时解决冲突