Introduction of Git commands

介绍Git的几种基本使用场景和解决问题方案,末尾附上更全面的来源资料。

StartTime: 2017-03-22,ModifyTime:2018-11-29

单账号单仓库

一般情况下(单人单仓库使用默认master开发),使用下面三条命令就足够用:

git add .
git commit -m ""
git push origin master

多人协作

  1. 新建自己的分支:
    git checkout develop (某分支) //本地切换到XXX分支
    git checkout -b feature/XXX
    git checkout -b bug/XXX
    
  2. 在开发和pull之前都要先查看一下本地目前所在分支是什么,列出本地现有的分支:
    git branch
    // 显示的结果里,每行最前面有星号的是当前的分支
    
  3. 修改完自己本地的代码后,可以更新自己的代码本地仓库(使用前两条命令)或push到远端自己的分支( git push 加上u参数,会在远端创建该分支 ):
    git add .
    git commit -m "XXXX"
    git pull origin develop --rebase
    //一个选择是可以在本地把某个分支合并到master分支里,再合并其他分支的修改到master:
    git checkout master
    git merge XXX(某分支)
    //另一个选择是本地不合并,按照第4点发起merge request交给其他人merge
    git push origin XXX
    

    git pull 加上rebase参数,好处是调整自己的分支到develop分支的最新基准,这样极大可能避免冲突。另外一个好处在于可以检查git pull默认的merge操作,这样就减少了一个分支。(每次merge都会延伸某个新的分支)

  4. push到远端自己的分支后,下一步是在图形化界面发起对master的merge request,指定master分支,指定review人员,请求管理员合并。
  5. 合并完成后,如果是bug修复或者不需要这个分支了,可以使用git branch -d hotfix命令删除本地这个分支。远端删除使用命令:git push origin :branch_name

Git Stash

git stash 可以暂存目前工作区的变更,这样就可以进行切换分支之类的操作了。

git stash apply //在新分支应用最近一次储藏
git stash apply stash@{2} //在新分支应用更早的储藏

git stash pop 来重新应用储藏,同时立刻将其从堆栈中移走

git stash branch XXX_NAME,这会创建一个新的分支,检验你储藏的变更,检出你储藏工作时的所处的提交,重新应用你的工作,如果成功,将会丢弃储藏。

git stash drop 移除储藏。

Git Fetch

  1. 把远端的代码同步下来,强制覆盖本地:
    git fetch --all && git reset --hard origin/master && git pull
    
  2. git fetch 从服务器下载index区域,并放到新分支,不下载code。

Git Add

git rm --cached . //移除错误add加入index区域的文件

Git Commit 正确用法

配置commit template

配置commit template,每次commit 都记录本次修改的主要内容。 一个举例: $ vim .commit_template Feature:/ BugId:/ Description: git config commit.template .commit_template 或者 git config –global commit.template .commit_template template 可以自行定义,也可以团队约定(建议)。

合并本地多次commit

git push 之前,合并式地本地提交多次commit,不应该每次用-m的参数零碎的提交:

git add XX -p //分每个修改处提交到index区
git commit -m "" //提交一次新的commit
git commit --amend //在没有push之前,在上次commit基础上继续增加commit内容,是合并了两次commit甚至以后多次

合并远端的同分支的多个commit

多次 git push 之后,应该合并一个功能分支的多个commit: 查看代码修改状态:

git log
git show HEAD^3
  1. rebase要合并的前面的一个commit_id git rebase -i commit_id.之后可以修改前面的commit,可以加入文件,可以删除commit
  2. 修改类似下面内容的文件里的第二个开始的所有pick为s
    pick 16a9a47 update3
    pick a7186d8 update2
    pick 7b16b28 update1
     # Rebase a9269a3..7b16b28 onto a9269a3 (3 commands)
     #.....
    

:x命令保存退出后会进入下一个文件修改。

  1. 再修改下一个结果文件
  2. git log //查看修改后 commit 时候已经合并,应该已经合并。但此时本地当前分支的 base commit_id 已经变了,所以需要重新和目标远端分支 rebase 基准,也就是执行下一步。

  3. git pull origin master/develop --rebase //这里执行后极有可能发现冲突,解决冲突
  4. 现在是返回了之前未 push 的状态,可以看一下git status是否所有代码都加入了index区域,然后直接再来一次push就可以了。

Git Status

git status 查看目前代码的状态,哪些是冲突的,哪些已经被加入了index进入版本控制,哪些还在 workspace。

Git Reset 本地回滚

git log //本地列出所有commit_id
git reset --hard commit-id //本地回滚
git reset --hard origin/master HEAD //从远端恢复代码和记录

git reset 回滚后想返回原来的代码,则可以用 git reflog 命令查看commit_ids操作记录,再恢复代码。

git reset 参数:

Git Pull 远端回滚

当自动部署系统发布后发现问题后,需要回滚到某一个commit,再重新发布。

原理:先将本地分支退回到某个commit,删除远程分支,再重新push本地分支。

操作步骤:

1、git checkout the_branch
2、git pull
3、git branch the_branch_backup //备份一下这个分支当前的情况
4、git reset --hard the_commit_id //把the_branch本地回滚到the_commit_id
5、git push origin :the_branch //删除远程 the_branch
6、git push origin the_branch //用回滚后的本地分支重新建立远程分支
7、git push origin :the_branch_backup //如果前面都成功了,删除这个备份分支

Git Branch

modify branch name

  1. Rename your local branch:
    git branch -m new-name //you are on the branch you want to rename
    git branch -m old-name new-name // you are on a different branch
    
  2. Delete the old-name remote branch and push the new-name local branch:
    git push origin :old-name new-name
    
  3. Reset the upstream branch for the new-name local branch(建立映射关系,使用本命令后后可以直接使用git push):
    git checkout #new-name-branch
    git push origin -u new-name
    

pull remote branch and create at local

拉取远端的分支,在本地建立对应的分支:

  1. 方法一:
    git checkout -b 本地分支名x origin/远程分支名x
    

    使用该方式会在本地新建分支x,会 自动切换到该本地分支x。 并 会自动和远程分支建立映射关系

  2. 方式二:
    git fetch origin 远程分支名x:本地分支名x
    

    使用该方式会在本地新建分支x,但是 不会 自动切换到该本地分支x,也不会和远程分支建立映射关系

Git 命令简写

git config --global alias.st  "status"
git config --global alias.ci "commit"
git config --global alias.co "checkout"

执行完上述命令后就可以使用以下简化命令了:

git st
git ci -a -m 'msg'
git co branch

Git Patch

UNIX世界的软件开发大多都是协作式的,因此,Patch(补丁)是一个相当重要的东西,因为几乎所有的大型UNIX项目的普通贡献者,都是通过 Patch来提交代码的。

个人理解: patch就是打补丁,通过git工具把代码的差分,生成patch文件, 然后通过git工具可以直接把patch文件的内容,merge到代码里面。

生成patch的命令:

git diff  > patch                        //本地变更  git diff 的内容,生成patch文件
git diff  branchname --cached > patch           //branch 之间差分生成patch文件
git format-patch HEAD^                                 //最近一次提交节点的patch
git format-patch  节点A   节点B        //两个节点之间的patch

使用patch:

git apply patch //将patch文件内容差分到本地
// 在使用patch之前可以使用以下命令,来测试,是否可以将patch完美打入本地src
git apply --check patch

多个 SSH-Key 如何使用

git可以新建多个ssh-key,有的可以专门用于自己的github,有的可以用于公司提交代码。

第一步是使用ssh-keygen -t rsa -c 'YOUR_WANT_NAME'创建自己想要命名的一对key文件, 第二步是创建名为config的文件,里面内容类似下方代码这样:

Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/github

Host code.aliyun.com
HostName code.aliyun.com
User git
IdentityFile ~/.ssh/COMPANY

第三步是把.pub结尾的公钥文件里的全部内容,粘贴到对应的远端仓库服务里,比如GitHub的setting里可以加入ssh-key,
第四步是提交或pull测试。

Git Remote 建立多个远端

git remote add XXX 增加远端头,可以一次推到多个远端

常出现的问题记录

(1)warning : permanently added the RSA host key for IP address '192.30.252.130' to the list of known list : 这个大概说的是, git自己把公钥自动加到~/.git/known_host文件里面了, 进去查一下,确实是这样的.总之能上传成功就是好的.

(2)提交之后遇到类似Permission denied (publickey).大意说你不具有读和写的权限:

解决办法1
git remote rm origin
git remote add origin git@github.com:LyleLee/practice.git
解决办法2
git push origin master

(3) remote: GitLab: You are not allowed to push code to protected branches on this project.
解决办法是请管理员开通对应branch的提交权限。

参考文献

Git 分支 - 分支的新建与合并

git 删除本地分支和远程分支、本地代码回滚和远程代码库回滚

git reset soft,hard,mixed之区别深解

git 分支命名规范

git commit配置模板

使用git进行团队合作开发

Git的Patch功能

git 生成 patch的命令

Rename a local and remote branch in git

git拉取远程分支并创建本地分支

git合并多个commit提交

git alias 命令简写缩写

您如果觉得有用,觉得写得还不错,可以一元赞赏作者。
   
微信捐赠图片
   
支付宝捐赠图片