zoukankan      html  css  js  c++  java
  • Git 协作:Fetch Pull Push Branch Remote Rebase Cherry-pick相关

    前言

    学习git的时候,我们首先学习的是最常用的,自己独立开发Software时用的命令:

    git init                                                                 //初始化git仓库
    git add <file_name>                                              //将文件添加到暂存区
    git rm <file_name>                                              //将暂存区的该文件删除
    git commit -m "<commit info>"                             //将暂存区的修改提交到当前分支
    git status                                                             //查看当前状态
    git reset --hard <commit_id>                                //切换到commit_id对应的版本
    git checkout -- <file_name>                                  //撤销file_name文件的工作区修改
    git reset HEAD <file_name>                                  //撤销暂存区的修改,将其放回工作区
    git diff HEAD -- <file_name>                                 //查看工作区和版本库里面file_name对应文件最新版本的区别
    git checkout <branch_name>                                 //切换到该branch
    git checkout -b <branch_name>                             //创建名为<branch_name>的branch并切换到该branch
    git clone <remote_git_address>                              //克隆远端仓库到本地

    而在实际工作中,我们往往要与他人一起合作开发/Debug。这个时候,就得学习在合作开发/Debug的情况下遇到的各种情况该怎么办,什么样的Git命令能解决我们的问题。

    场景1: 需要拉取陌生远端分支到本地。我们本地有一个自己的repo, 此时同事遇到一个比较难的Bug想请你帮忙一起看看,但是这个Bug在你自己的repo的branch上没有,于是同事将其branch推送到了他自己的Github远端仓库里,然后把远端仓库的git address和branch name发给你了。此时我们该怎么办呢?

    我们应该:

    1. 添加一个远端源 git remote add <remote_host> <remote_git_address>
    2. 将远端源的信息拉过来 git fetch <remote_host>
    3. 拉取远端源repo的一个分支到本地分支 git checkout -b <local_branch> <remote_host>/<remote_branch>

    场景2: 本地与远端同一分支提交历史不一致。本地与远端同一分支提交历史不一致。多个人在同一个分支上协作时,出现冲突是很正常的,比如现在有一个项目由我和A一同开发。我在修复了一个bug以后准备提交,现在准备推送到远端。push失败了,发现A在我之前已经提交了,我本地master分支的提交历史已经落后远端了,需要先pull一下,与远端同步后才能push。

    直接执行 git pull --rebase

    场景3:其他场景

    //将目标分支的代码Merge到本地分支 
    git merge <object_branch>
    //if has conflicts and want to just cover the current code with object branch code, add "--strategy-option theirs" parameter
    //将本地分支代码推送到远端源指定分支 
    git push <local_branch> <remote_host>:<remote_branch>
    //if want to cover the remote code with local code, add "-f" parameter

    在以上场景中,我们可能会有疑问:git fetch和git pull有什么区别,git remote的作用是什么,有哪些用法?下面我们详细说说

    先用一张图来梳理一下git fetch和git pull的概念:

    git fetch是将远程主机的最新内容拉到本地,注意,此时远端主机的最新内容并没有在你本地的任何branch上。而是否下载/合并到本机分支中是由用户决定的。如果用户想要这个最新内容,可以用git checkout -b <new_local_branch> <remote_name>/<branch_name>拉取到本地分支,然后git checkout <current_working_branch>,最后git merge --rebase <new_local_branch>,最终合并到本地分支。
    而git pull 则是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge,这样可能会产生冲突,需要手动解决。

    git branch的用法

    git branch //查看本地所有分支 
    git branch -r //查看远程所有分支
    git branch -a //查看本地和远程的所有分支
    git branch <branchname> //新建分支
    git branch -d <branchname> //删除本地分支
    git push origin --delete <branchname>  //删除远程分支,删除后还需推送到服务器
    git branch -m <oldbranch> <newbranch> //重命名本地分支
    git push origin:<branchname>  //推送当前本地分支至服务器指定分支

    git fetch的用法

    git fetch <remote_name> //这个命令将某个远程主机的更新全部取回本地
    git fetch <remote_name> <branch_name> //只想取回特定分支的更新,可以指定分支名
    git fetch origin master //取回origin 主机的master 分支
    git log -p FETCH_HEAD //取回更新后,会返回一个FETCH_HEAD ,指的是某个branch在服务器上的最新状态,我们可以在本地通过它查看刚取回的更新信息

    git pull的用法

    //git pull的过程可以理解为:
    git fetch origin master //从远程主机的master分支拉取最新内容 
    git merge FETCH_HEAD    //将拉取下来的最新内容合并到当前所在的分支中
    
    //即将远程主机的某个分支的更新取回,并与本地指定的分支合并,完整格式可表示为
    git pull <remote_host> <remote_branch>:<local_branch>
    
    //如果远程分支是与当前分支合并,则冒号后面的部分可以省略:
    git pull origin next

    git remote的用法

    git remote //git remote 不带参数,列出已经存在的远程分支
    git remote -v | --verbose 列出详细信息,在每一个名字后面列出其远程url
    git remote add pb git://github.com/paulboone/ticgit.git //添加远程仓库并将其命名为pb

    git push的用法

    //git push的一般形式为 git push <remote_host> <local_branch>:<remote_branch> ,
    //例如 git push origin master:refs/for/master ,即是将本地的master分支推送到远程主机origin上的对应master分支
    //origin 是远程主机名。第一个master是本地分支名,第二个master是远程分支名
    git push origin master //如果远程分支被省略,如上则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建 git push origin :refs/for/master 如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支,等同于 git push origin –delete master git push origin //如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,将当前分支推送到origin主机的对应分支 git push //如果当前分支只有一个远程分支,那么主机名都可以省略,形如 git push,可以使用git branch -r ,查看远程的分支名

     git rebase的用法

    //最常用的用法 变基操作 即把目标branch的修改添加为当前branch的基底的一部分
    git rebase <object_branch>
    
    //-i参数是交互模式 我们常常用来合并当前branch的commit和修改commit的信息
    git rebase -i HEAD~4         //HEAD~后面跟的数字就是要修改的commit的个数

    git cherry-pick的用法

    //使用git cherry-pick命令,可以选择将现有的一个或者多个提交的修改引入当前内容。
    
    //假设你现在正在开发一个项目,有一个功能分支 feature,开发分支 develop。 feature 有3个提交,分别是 A ,B ,C 。develop 分支只想加入 C 功能, 此时合并操作无法满足,因为直接合并 feature,会将3个提交都合并上,我想合并就只有 C,不要 A,B。此时就可以用cherry pick
    
    //具体的做法:
    
    //切换到 develop 分支。
    //通过 git log feature,找到 C 的 SHA1 值。
    //通过 git cherry-pick <C的SHA1> ,将 C 的修改内容合并到当前内容分支 develop 中。
    //若无冲突,过程就已经完成了。如果有冲突,按正常冲突解决流程即可。
    
    git cherry-pick <C的SHA1>

    参考链接:

    1. git rebase使用 https://www.jianshu.com/p/f7ed3dd0d2d8

    2. git命令之git remote用法 https://www.cnblogs.com/wuer888/p/7655856.html

    3. git的add commit push的详细介绍 https://www.jianshu.com/p/2e1d551b8261

    4. git fetch pull详解 https://www.cnblogs.com/runnerjack/p/9342362.html

    5. git cherry-pick用法 https://blog.csdn.net/qq_32452623/article/details/79449534

  • 相关阅读:
    nginx-1.8.1的安装
    ElasticSearch 在3节点集群的启动
    The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from required .class files
    sqoop导入导出对mysql再带数据库test能跑通用户自己建立的数据库则不行
    LeetCode 501. Find Mode in Binary Search Tree (找到二叉搜索树的众数)
    LeetCode 437. Path Sum III (路径之和之三)
    LeetCode 404. Sum of Left Leaves (左子叶之和)
    LeetCode 257. Binary Tree Paths (二叉树路径)
    LeetCode Questions List (LeetCode 问题列表)- Java Solutions
    LeetCode 561. Array Partition I (数组分隔之一)
  • 原文地址:https://www.cnblogs.com/ArsenalfanInECNU/p/11551803.html
Copyright © 2011-2022 走看看