Git 协作:Fetch Pull Push Branch Remote Rebase Cherry-pick相关

时间:2022-01-28 11:26:28

前言

学习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发给你了。此时我们该怎么办呢?

我们应该:

. 添加一个远端源 git remote add <remote_host> <remote_git_address>
. 将远端源的信息拉过来 git fetch <remote_host>
. 拉取远端源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 Pull Push Branch Remote Rebase Cherry-pick相关

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~ //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

Git 协作:Fetch Pull Push Branch Remote Rebase Cherry-pick相关的更多相关文章

  1. 【记录】gitLab git命令add commit fetch pull push

    最近项目使用git进行版本控制,由于之前用svn,所以对git不是太熟悉,网上一通乱找git各命令含义, 以下内容感觉讲的很详细,可以很清楚理解git提交流程,博主把重要的信息用红字标注了,更加显眼. ...

  2. Windows下Git免密码pull&amp&semi;push

    Windows下Git在使用http方式的时候clone,pull,push需要输入用户名及密码,通过以下设置可以免密码 在用户文件夹创建文件.git-credentials内容如下 https:// ...

  3. Git笔记(pull&sol;push)

    一.从远程服务器上获取分支 git pull <远程主机名> <远程分支>:<本地分支> 例如 git pull origin master:loacal_bran ...

  4. git免密码pull&comma;push

    执行git config --global credential.helper store

  5. git fetch&comma; merge&comma; pull&comma; push需要注意的地方(转)

    在git操作中,我们经常会用到fetch, merge, pull和push等命令,以下是一些我们需要注意的地方. 给大家准备了参考资料: 1. Whatʼs a Fast Forward Merge ...

  6. git fetch&comma; merge&comma; pull&comma; push需要注意的地方

    在git操作中,我们经常会用到fetch, merge, pull和push等命令,以下是一些我们需要注意的地方. 给大家准备了参考资料: 1. Whatʼs a Fast Forward Merge ...

  7. Git应用详解第六讲:Git协作与Git pull常见问题

    前言 前情提要:Git应用详解第五讲:远程仓库Github与Git图形化界面 git除了可以很好地管理个人项目外,最大的一个用处就是实现团队协作开发.况且,linus大神开发git的初衷就是为了维护L ...

  8. Git 少用 Pull 多用 Fetch 和 Merge&lpar;转&rpar;

    英文原文:git: fetch and merge, don’t pull This is too long and rambling, but to steal a joke from Mark T ...

  9. Git 一次性 pull push 所有的分支

    /********************************************************************************* * Git 一次性 pull pu ...

随机推荐

  1. Android使用AudioTrack发送红外信号

    最近要做一个项目,利用手机的耳机口输出红外信号,从而把手机变成红外遥控器,信号处理的知识基本都还给老师了,刚开始真的挺头疼.找了不少资料研究了一下,总算有点心得,在这里做个备忘. 一.音频信号输出原理 ...

  2. jquery 原理

    /* * my-jquery-1.0 *//* * 网上也有很多实现的版本,不过这是我在我自己的理解下写的,加上注释,希望可以解释清楚.*//* * 整个jquery包含在一个匿名函数中,专业点叫闭包 ...

  3. 树莓PI交叉编译BOOST库(asio网络例子)

    环境搭建参考上一篇文章[http://www.cnblogs.com/yuliyang/p/4023758.html] 客户端(use boost.asio on raspberry pi )clie ...

  4. 第一次使用并配置Hibernate

    1. 环境配置 1.1 hiberante环境配置 hibernate可实现面向对象的数据存储.hibernate的官网:http://hibernate.org/ 官网上选择hibernate OR ...

  5. window&period;open打开文件乱码

    问题:刚开始使用window.open在IE兼容模式下打开文件下载出现乱码. 一开始以为是文件名是中文导致的.然后使用a标签的download属性更改文件名解决. <a class=" ...

  6. Nginx gzip参数详解及常见问题(已解决)

    1.Nginx gzip功能 Nginx实现资源压缩的原理是通过ngx_http_gzip_module模块拦截请求,并对需要做gzip的类型做gzip,ngx_http_gzip_module是Ng ...

  7. struts2框架学习笔记7:struts2标签

    三大标签: 1.JSP:脚本,为了替代servlet,已过时 2.JSTL:标准标签库(core.format.sql.xml),还未淘汰的只有core库 3.Struts2标签库:由Struts2开 ...

  8. Pyhon环境变量的一些坑

    在正常的情况下,使用编译器执行Python文件,无需考虑环境变量的改变 例:sum --one --one1.py --two --two1.py 在执行one.py文件需要调用 two.py中某个方 ...

  9. 【&lbrack;APIO2010&rsqb;巡逻】

    \(APIO\)的题就是非常难啊 首先看到\(k=1\)的情况,显然我们只需要找到一条直径把这条直径的两端连起来就好了 因为我们连这一条新边的实质是使得这一条链上的边不需要重复经过了,我们想让走的边尽 ...

  10. linux挂在新硬盘

    login as: rootroot@192.168.109.128's password:Last login: Fri Mar 22 14:12:08 2019 from 192.168.109. ...