博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Git常用操作及分支
阅读量:6852 次
发布时间:2019-06-26

本文共 6801 字,大约阅读时间需要 22 分钟。

hot3.png

Push & Pull 命令介绍

在提交代码之前首先了解两个命令,这两个命令需要与远程仓库配合。

Push :直译过来就是「推」的意思,如果你本地代码有更新,那么就需要把本地代码推到远程仓库,这样本地仓库跟远程仓库就可以保持同步了。

代码示例: **git push origin master**

意思就是把本地代码推到远程 master 分支。

Pull:直译过来就是「拉」的意思,如果别人提交代码到远程仓库,这个时候你需要把远程仓库的最新代码拉下来,然后保证两端代码的同步。

代码示例: **git pull origin master**

意思就是把远程最新的代码更新到本地。一般在 push 之前都会先 pull ,这样不容易冲突。

提交代码

添加 SSH key 成功后,就有权限向 GitHub 提交自己的项目代码了,提交代码有两种方法:

(1)Clone自己的项目

此处以我在 GitHub 上创建的 test 项目为例,执行如下命令:

git clone git@github.com:stormzhang/test.git

这样就把 test 项目 clone 到了本地,可以把 clone 命令理解为高级的复制,这个时候该项目本身就已经是一个git 仓库了,不需要执行 **git init** 进行初始化,并且已经关联好了远程仓库,只需要在这个 test 目录下任意修改或者添加文件,然后进行 commit ,之后就可以执行:

git push origin master

进行代码提交,这种是最简单方便的一种方式。

怎么获取项目的仓库地址呢?如下图:

5ElBM1Rd9v8vWfPW.jpeg

 (2)关联本地已有项目

如果本地已经有一个完整的 git 仓库,并且已经进行了多次 commit ,这个时候第一种方法就不适合了。

假设本地有个 test2 的项目,需要在 GitHub 上建一个 test 的项目,然后把本地 test2 上的所有代码 commit 记录提交到 GitHub 上的 test 项目。

第一步就是在 GitHub 上建一个 test 项目,这个想必大家都会了,就不多讲了。

第二步把本地 test2 项目与 GitHub 上的 test 项目进行关联,切换到 test2 目录,执行如下命令:

git remote add origin git@github.com:stormzhang/test.git

意思是添加一个远程仓库,地址是 **git@github.com:stormzhang/test.git** ,而 origin 是给这个项目的远程仓库起的名字(可以随便取),只不过大家公认的只有一个远程仓库时名字就是 origin ,为什么要给远程仓库取名字?因为我们可能一个项目有多个远程仓库,比如 GitHub 一个,比如公司一个,这样的话提交到不同的远程仓库就需要指定不同的仓库名字。

查看当前项目有哪些远程仓库可以执行如下命令:

git remote -v

接下来,本地的仓库就可以向远程仓库进行代码提交了:

git push origin master

此命令就是默认向 GitHub 上的 test 目录提交了代码,这个代码是在 master 分支。当然你可以提交到指定的分支,这个之后的文章再详细讲解。

注意:在提交代码之前先要设置下自己的用户名与邮箱,这些信息会出现在所有的 commit 记录里,执行以下代码就可以设置:

 

 

git config —global user.name "stormzhang"

git config —global user.email "stormzhang.dev@gmail.com"

用户名和邮箱

通过前面的学习,相信大家已经可以使用 Git 管理自己的代码了,但这些还远远不够,关于Git还有很多知识与技巧,接下来就给大家介绍一些 Git 进阶的知识。

在 GitHub 上的每一次commit都会产生一条log,这条log标记了提交人的姓名与邮箱,目的是便于其他人查看与联系提交人,因此,进行提交代码的第一步就是要设置自己的用户名与邮箱。执行以下命令:

 

 

git config --global user.name "stormzhang"

git config --global user.email "stormzhang.dev@gmail.com"

 

 

以上进行了全局配置,如果某一个项目想要使用特定的邮箱,那么只需切换到相应的项目,将上述代码中的 **--global** 参数去除,再重新执行一遍就可以了。

注意:在 GitHub 上的每次提交理论上都会在主页的下方产生一条绿色小方块的记录,如果确认提交后,没有绿色方块显示,那一定是所提交代码配置的邮箱与当前 GitHub 上的邮箱不一致,GitHub 上的邮箱可以到 **Setting -> Emails**里查看。

alias

一些Git命令操作很频繁,例如:

  • git commit
  • git checkout
  • git branch
  • git status
  •  ...

对于这些频繁的操作,每次都要输入完全确实有些麻烦,有没有一种简单的缩写输入呢?比如对应的直接输入以下:

  • git c
  • git co
  • git br
  • git s
  • ...

是不是很简单快捷?这个时候就用到alias配置,翻译过来就是别名的意思,输入以下命令就可以直接满足以上的需求。

  • git config --global alias.co checkout  # 别名
  • git config --global alias.ci commit
  • git config --global alias.st status
  • git config --global alias.br branch

当然以上别名不是固定的,可以根据自己的习惯去定制,除此之外还可以设置组合,比如:

  • git config --global alias.psm 'push origin master'
  • git config --global alias.plm 'pull origin master'

之后经常用到的**git push origin master** 和 **git pull origin master** ,直接使用 **git psm** 和 **git plm** 就可以代替。

这里给大家推荐一个很强大的 alias 命令,当输入 **git log** 查看日志的时候是类似这样的:

Yv5eHWcFIvUWSgKq.jpeg

如果输入**git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative ** ,日志就会变成这样:

ETKjm9EF5z0HYk63.jpeg

是不是比较清晰,整个分支的走向也很明确,但是每次都要输入这么长是不是也很烦?这时候你就该想到 alias :

    git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative"

配置完成后,直接输入 **git lg** 就可以了。

其他配置

当然还有一些其他有用的配置,默认情况下 git 用的编辑器是 vi ,如果不喜欢可以改成其他编辑器,比如 vim 。

git config --global core.editor "vim"  # 设置Editor使用vim

如果喜欢其他编辑器可自行搜索配置,前提是本机有安装。

有些人会疑问怎样才能让终端显示各种颜色,输入如下命令即可:

git config --global color.ui true

还有些其他的配置如:

git config --global core.quotepath false # 设置显示中文文件名

以上基本的配置就差不多了,默认这些配置都在 **~/.gitconfig** 文件下的,你可以找到这个文件查看自己的配置,也可以输入 **git config -l** 命令查看。

diff

diff命令是很常用的,在开发过程中,大家会经常做一些代码改动,但时间久了难免会忘记做过哪些改动,在提交之前需要确认下,这个时候就可以用diff来查看到底做了哪些改动,例如,有一个 a.md 的文件,做了一些改动,当输入 **git diff** 时,就会看到如下内容:

Y2Z5HKRyWYAzyVD7.jpeg

红色的部分前面有个 **-** 代表删除的内容,绿色的部分前面有个 **+** 代表增加的内容,从这里可以一目了然的知道自己到底对这个文件做了哪些改动。

需要注意的是,直接输入 **git diff** 只能比较当前文件和暂存区文件差异,什么是暂存区?就是还没有执行 **git add** 的文件。

当然除了与暂存区做比较之外,他还可以有其他用法,如比较两次 commit 之间的差异,比较两个分支之间的差异,比较暂存区和版本库之间的差异等,具体用法如下:

  • git diff <$id1> <$id2>   # 比较两次提交之间的差异
  • git diff <branch1>..<branch2> # 在两个分支之间比较 
  • git diff --staged   # 比较暂存区和版本库差

checkout

**checkout** 一般用作切换分支使用,比如切换到 develop 分支,可以执行:

 git checkout develop

但是 **checkout** 不只用作切换分支,也可以用来切换tag,切换到某次commit,如:git checkout v1.0

 git checkout ffd9f2dd68f1eb21d36cee50dbdd504e95d9c8f7 # 后面的长串是commit_id,是每次commit的SHA1值,可以根据 git log 看到。

除了有“切换”的作用,**checkout** 还可以用作撤销,例如,假设在一个分支开发一个功能,写到一半时需求变化了,而且是大变化,之前写的代码完全不能用,目前还没有 **git add** 进暂存区,这个时候很简单的一个操作就可以直接把原文件还原:

git checkout a.md

注意,**checkout** 命令只能撤销还没有 add 进暂存区的文件。

stash

设想一个场景,假设我们正在一个新的分支做新的功能,这个时候突然有一个紧急的bug需要修复,而且修复完之后需要立即发布。同学可能会想先把刚写的一点代码进行提交就行了,这样做理论上是没问题的,但是原则上每次的 commit 都要有实际的意义,目前代码只是写了一半,是不建议 commit 的,那么有没有一种比较好的办法,可以暂时切到其他分支,修复完bug再切换回来,并且代码也能保留的?

首先,暂存 commit 代码:

此时, **stash** 命令就大有用处了,前提是当前代码没有进行 **commit** ,执行了 **add** 也没关系,首先执行命令:git stash

意思就是把当前分支所有没有 commit 的代码先暂存起来,这个时候再执行 **git status** 命令,会发现当前分支很干净,几乎看不到任何改动,自己代码的改动也看不见,但其实是暂存起来了。

执行命令 git stash list 会发现此时暂存区已经有了一条记录。

其次:切换分支,代码还原:

这个时候就可以切换到其他分支,把bug修复好,然后发布。一切都解决了,再切换回来继续之前没做完的功能,但之前的代码怎样还原呢?

执行命令 git stash apply 会发现之前的代码全部回来了,就好像一切都没发生过一样。

最后,删除暂存区记录:

接下来最好把暂存区的**stash** 记录删除,执行:git stash drop 就把最近一条的 **stash** 记录删除了。

代码还原其实还有更简便的,可以执行:git stash pop 来代替 **apply** 命令,**pop** 与 **apply** 的唯一区别就是 **pop** 不但会帮将代码还原,还会自动帮将本条 **stash** 记录删除,不需要手动 **drop** 了,为了验证你可以执行 **git stash list** 命令来确认是不是已经没有记录了。

最后还有一个命令介绍下:

git stash clear

就是清空所有暂存区的记录,**drop** 是只删除一条,当然后面可以跟 **stash_id** 参数来删除指定的某条记录,没有参数就是删除最近的,而 **clear** 是清空。

merge & rebase

大家都知道 **merge** 分支是合并的意思,当在一个 featureA 分支开发完一个功能需要合并到主分支 master 上时,只需要进行如下操作:

  • git checkout master
  • git merge featureA

其实 **rebase** 命令也是合并的意思,上面的需求同样可以进行如下操作:

  • git checkout master
  • git rebase featureA

**rebase** 跟 **merge** 的区别?

可以理解成有两个书架,你需要把两个书架的书整理到一起,第一种做法是 **merge** ,简单粗暴,直接空出一块地方把另一个书架的书全部放进去,这种做法你可以知道哪些书是来自另一个书架;第二种做法就是 **rebase** ,会对两个书架的书先进行比较,按照购书的时间重新排序,然后重新放置好,这样做的好处就是合并之后的书架看起来逻辑清晰,但是很难清楚的知道哪些书来自哪个书架。

只能说各有好处的,不同的团队根据不同的需要以及不同的习惯来选择就好。

分支

1. 什么是分支?

对于分支这个概念,可以这样理解,几个人一起去旅行,走到一个三岔口,每条路可能有不同的风景,大家约定 3 天之后在某地汇聚,然后各自出发了。这三条分叉路就可以理解为各自的分支,而大家汇聚的时候就相当于将各自的分支进行了合并。  

2. 分支的常用操作

通常默认会有一个主分支叫 master ,下面首先来介绍一下关于分支的一些基本操作:

(1)新建一个叫 develop 的分支

git branch develop 

注意,新建分支的命令是基于当前所在分支进行的,即以上是基于 mater 分支新建了一个叫做 develop 的分支,此时 develop 分支与 master 分支的内容完全一样。例如,有 A、B、C三个分支,各分支内容不同,如果当前是在 B 分支,执行新建分支命令,则新建的分支内容与 B 分支相同,同理如果当前在 C 分支,那就是基于 C 分支基础上新建的分支。

(2)切换到 develop 分支

git checkout develop

如果把以上两步合并,即新建并自动切换到 develop 分支:

git checkout -b develop 

(3)把 develop 分支推送到远程仓库

git push origin develop

如果你远程的分支想取名叫 develop2 ,执行以下代码:

git push origin develop:develop2

注意:实际开发管理,建议不要这样做,这样会导致很混乱,难管理,建议本地分支与远程分支名称要保持一致。

(4)查看本地分支列表 

git branch 

(5)查看远程分支列表

git branch -r

(6)删除本地分支

git branch -d develop    

git branch -D develop (强制删除)    

(7)删除远程分支

git push origin :develop

如果远程分支有 develop ,而本地没有,想要将远程的 develop 分支迁到本地:

git checkout develop origin/develop

同样的把远程分支迁到本地顺便切换到该分支:

git checkout -b develop origin/develop

转载于:https://my.oschina.net/kingchen8080/blog/1637722

你可能感兴趣的文章