Qingquan-Li / blog

My Blog
https://Qingquan-Li.github.io/blog/
132 stars 16 forks source link

Git 远程操作(以 GitHub 为例)(git checkout、remote、push、pull、fetch、merge) #102

Open Qingquan-Li opened 6 years ago

Qingquan-Li commented 6 years ago

参考:


Git 远程操作常用命令:


实例一:新建本地 gh-pages 分支并推送到远程分支

git-jekyll


1. git checkout

箭头二: git checkout --orphan gh-pages 表示创建一个新的(孤立)分支 gh-pages (本地新建 Git 仓库,默认分支为 master ),并 checkout 切换到 gh-pages 分支中。

Git 1.7.2 开始支持 git checkout --orphan <新的本地分支>


应用场景:

在一个项目的任何时候,您都可以从一个干净的分支开始。一般用于本地新建仓库并新建分支时(不是 git clone )或开始一个新的分支时时(见下文)。 注意:Orphan branches can't be (reasonably) merged 。

假如你的某个分支上,积累了无数次的提交,你也懒得去打理,打印出的 log 也让你无力吐槽,那么这个命令将是你的神器,它会基于当前所在分支新建一个赤裸裸的分支,没有任何的提交历史,但是当前分支的内容一一俱全。新建的分支,严格意义上说,还不是一个分支,因为 HEAD 指向的引用中没有 commit 值,只有在进行一次提交后,它才算得上真正的分支。


语法:

git checkout -b <本地分支名> <远程主机名>/<远程分支名>


git checkout 使用实例

git clone 克隆远程仓库时,本地通常会自动地创建一个追踪 origin/master 的 master 分支。 当然也可以手动设置( 使用 git checkout 切换分支)其他分支(追踪远程主机的其他分支)。


实例一:

建立跟踪分支最常用的方式: git checkout --track <远程主机名>/<远程分支名> ,等同于 git checkout -b <本地分支名> --track <远程主机名>/<远程分支名>

# 创建一个与远程分支具有相同名称的新本地分支,并建立追踪关系
➜  /Users/fatli/Documents/GitHub/fatli git:(master) > git checkout --track origin/gh-pages
Branch gh-pages set up to track remote branch gh-pages from origin.
Switched to a new branch 'gh-pages'



实例二:

git clone 自 GitHub 上的仓库(假设有 master 和 gh-pages 分支)时,本地默认只显示 master 分支(追踪 GitHub 上的 master 分支),此时如果要在本地显示 gh-pages 分支(并设置(set up)追踪(track) GitHub 上的 gh-pages 分支):

# 方法一:使用 git checkout gh-pages 命令,此时切换到:本地新建的一个与远程主机同名的分支(基于origin/gh-pages分支),并且设置(set up)追踪(track)远程主机origin的gh-pages分支
# git checkout gh-pages 等同于 git checkout -b ph-pages origin/gh-pages
➜  /Users/fatli/Documents/GitHub > git clone git@github.com:fatlitalk/fatli.git
# ......
➜  /Users/fatli/Documents/GitHub > cd fatli
➜  /Users/fatli/Documents/GitHub/fatli git:(master) > git checkout gh-pages
Branch gh-pages set up to track remote branch gh-pages from origin.
Switched to a new branch 'gh-pages'
➜  /Users/fatli/Documents/GitHub/fatli git:(gh-pages) > git add test.md
➜  /Users/fatli/Documents/GitHub/fatli git:(gh-pages) ✗ > git commit -m "add test.md"
# ......
➜  /Users/fatli/Documents/GitHub/fatli git:(gh-pages) > git push
# 方法二:使用 git checkout -b newBranch origin/gh-pages 命令,此时切换到:本地新建的一个名为newBranch的分支(基于origin/gh-pages分支),并且设置(set up)追踪(track)远程主机origin的gh-pages分支
➜  /Users/fatli/Documents/GitHub > git clone git@github.com:fatlitalk/fatli.git
# ......
➜  /Users/fatli/Documents/GitHub > cd ./fatli
➜  /Users/fatli/Documents/GitHub/fatli git:(master) > git checkout -b newBranch origin/gh-pages
Branch newBranch set up to track remote branch gh-pages from origin.
Switched to a new branch 'newBranch'
➜  /Users/fatli/Documents/GitHub/fatli git:(newBranch) ✗ > git add .
➜  /Users/fatli/Documents/GitHub/fatli git:(newBranch) ✗ > git commit -m "delete test02.md"
# ......
➜  /Users/fatli/Documents/GitHub/fatli git:(newBranch) ✗ > git push origin newBranch:gh-pages

注意:上面的 git push origin newBranch:gh-pages 命令,使用 git pushgit push origin 将失败(本地分支名与远程主机的分支名同名,并且存在“追踪关系”(tracking)才可以采用这种省略写法),使用 git push origin newBranch 将在 GitHub 创建一个名为 newBranch 的分支。具体见下面标题” git push “。


2. git remote

箭头三: git remote add origin git@github.com:FatliTalk/jekyll_demo.git 表示关联远程(remote)仓库。


语法:

git remote add <主机名> <网址>



3. git push

箭头五: git push 表示将本地的 gh-pages 分支推送到 origin 主机的 gh-pages 分支(远程分支)。注意:本地分支名与远程主机的分支名同名,并且存在“追踪关系”(tracking)才可以采用这种省略写法。


语法:

git push <远程主机名> <本地分支名>:<远程分支名>





实例二: git pull 取回远程分支更新并与本地分支合并

git-pull


git pull :取回远程主机某个分支的更新,再与本地的指定分支合并。

使用场景:因为远程主机某个分支的更新(例如在 github.com 上直接修改了分支的内容,而本地主机并不会作相应更新),导致在本地进行 git push 失败,此时需要执行 git pull 取回远程主机对应分支的更新,与本地的指定分支合并。

语法:

git pull <远程主机名> <远程分支名>:<本地分支名>


1. git pull

如果当前分支只有一个追踪分支,连远程主机名都可以省略:

实例:上图箭头所示,执行 git pull 命令,当前分支自动与唯一一个追踪分支进行合并。


附: git branch -u 手动建立本地分支与远程分支的追踪关系:

实例:指定 myBranch 分支追踪 origin/next 分支:

git branch --set-upstream myBranch origin/gh-pages
# 等同于
git branch -u myBranch origin/gh-pages

注意:git 1.8.0git branch --set-upstream 已弃用,以后可能会被删除 。建议使用 git branch -ugit branch --set-upstream-to


2. git pull <远程主机名>

如果当前分支与远程分支存在追踪关系(tracking),例如从远程主机 git clone 下来的分支默认自动追踪远程分支, git pull 就可以省略远程分支名:

git pull origin


3. git pull <远程主机名> <远程分支名>

如果是取回远程主机某个分支与当前分支合并,则冒号后面的部分可以省略,例如取回 GitHub 上的 gh-pages 分支与当前分支合并:

git pull origin gh-pages

实质上,这等同于先做 git fetch ,再做 git merge

git fetch origin
git merge origin/gh-pages


4. git fetch

远程主机的版本库有了更新(有了新的 commit ),需要将这些更新取回本地:

git fetch <远程主机名>

默认情况下, git fetch 取回所有分支( branch )的更新。取回特定分支的更新:

git fetch <远程主机名> <远程分支名>

注意: git fetch 命令通常用来查看其他人的进程( commit ),因为它取回的代码对你本地的开发代码没有影响(不新增、减少、修改本地代码,只记录在 Git 中),除非使用 git merge 命令与本地分支合并。


附:git branch -a 查看所有分支

➜  /Users/fatli/Documents/jekyll_demo git:(gh-pages) > git branch -a
* gh-pages
  remotes/origin/gh-pages
  remotes/origin/master
➜  /Users/fatli/Documents/jekyll_demo git:(gh-pages) > git branch -r
  origin/gh-pages
  origin/master

注意:上面实例中, 星号 表示本地主机的当前分支是 gh-pages ,远程分支是 origin/gh-pages 和 origin/master 。


5. git merge 或 git rebase

git fetch 取回远程主机的更新(有了新的 commit )以后,可以在它(远程分支)的基础上,使用 git checkout 命令创建一个新的分支:

git checkout -b <本地分支名> <远程主机名>/<远程分支名>


此外,也可以使用 git merge 命令或者 git rebase 命令,在本地分支上合并远程分支。

实例:在 github.com 中新增一个 test.txt 文件, 执行 git fetch 命令后本地主机中并不会多出一个 test.txt 文件,直到执行 git merge 命令:

➜  /Users/fatli/Documents/jekyll_demo git:(gh-pages) > git fetch
# ......
➜  /Users/fatli/Documents/jekyll_demo git:(gh-pages) > ls -a
.           .DS_Store   README.md   _layouts    images
..          .git        _config.yml _posts      index.html
➜  /Users/fatli/Documents/jekyll_demo git:(gh-pages) > git merge
# ......
➜  /Users/fatli/Documents/jekyll_demo git:(gh-pages) ✗ > ls -a
.           .DS_Store   README.md   _layouts    images      test.txt
..          .git        _config.yml _posts      index.html