Git使用教程

Git 是 Linux 发明者 Linus 开发的一款版本控制系统,能够方便地对代码进行管理。版本控制是一种记录一个或若干文件内容的变化,以便将来查阅特定版本修订情况的系统。主要有以下功能:

  • 远程备份代码,能够与本地进行同步,防止代码的丢失
  • 方便开发团队进行协同开发,既可以减少相互之间的影响,又可以同步别人的代码
  • 开发时出现 bug,此时可以紧急对代码进行还原
  • 软件版本的功能迭代越来越多时,能够清楚的知道每个版本的代码改动记录,甚至是每一个人的历史提交代码情况

1. Git 安装

  • Mac:https://sourceforge.net/projects/git-osx-installer/
  • Windows:https://git-for-windows.github.io/
  • Linux:apt-get install git

2. Git 命令列表

Git 所有操作命令开头都要以 git 开头,在 Windows 下,在 cmd 窗口输入命令 git,可以查看到 Git 最常用的命令及使用方法。
git 命令列表


3. Git 具体命令

第一步,首先新建一个文件夹,在文件夹里面新建一个文件a.md,Linux 用户可以用下面的命令创建:

mkdir test  (创建文件夹 test)
cd test     (切换到 test 目录)
touch a.md  (新建 a.md 文件)

注意,在进行任何 Git 操作前,都要先切换到 Git 仓库目录下,也就是要切换到项目的文件夹目录下。

git init

初始化 git 仓库,也就是新建一个 git 仓库。

git status

这个命令顾名思义就是查看状态,可以看到提示a.md文件还没有提交到仓库里。

git add

a.md 文件还没有提交到仓库里,这个时候编辑下该文件,然后使用git add a.md命令可以将这个文件添加到缓存区,可以使用 git status 查看仓库的状态。这里也可以使用git rm --cached这个命令移除这个缓存。

git commit

接着输入git commit -m 'first commit'
这个命令的意思是提交到仓库,-m代表提交信息,'first commit'表示提交的信息为'first commit'。使用这个命令后可以将缓存区中的内容提交到仓库里。先将改动保存到缓存区再提交到仓库,是为了防止误提交。

git log

这个时候输入git log就会看到所有产生的 commit 记录还有提交的时候附带的信息,例如上面提到的'first commit'

git branch

branch 即分支的意思,分支概念在版本控制系统中十分重要。举个运用分支的例子:A 和 B 在做同一个项目,但是不同的模块,这个时候 A 新建了一个分支叫 a,B 新建了一个分支叫 b,这样 A,B 做的所有代码改动都各自在各自的分支,互不影响,等到两人都把各自的模块都做完了,最后再统一把分支合并起来。

执行git init初始化 git 仓库之后会默认生产成一个主分支 master,也就是你所在的默认分支,也基本是实际开发正式环境下的分支,一般情况下 master 分支不会轻易在上面操作的,你可以输入git branch查看下当前分支的情况。

如果想在此基础上新建一个分支,执行git branch develop就新建了一个叫 develop 的分支,这时候分支 develop 跟分支 master 是一模一样内容,再输入git branch查看当前分支的情况:
在这里插入图片描述
可以看到 master 分支前有个 * 号,即虽然新建了一个 develop 分支,但是当前分支还是在 master 分支上,如果我们想在 develop 分支上进行开发,首先要切换到 develop 分支上才行。
执行git checkout develop切换到 develop 分支,然后再输入git branch查看分支情况:
在这里插入图片描述

可以看到我们当前所在的分支已经是 develop 分支,这个时候 A 可以尽情地在他新建的 develop 分支上进行代码的改动了。

如果嫌先新建再切换太麻烦,也可以使用git checkout -b develop一步到位。

git push origin develop

将本地的 develop 分支推送到远程仓库,如果你希望远程该分支叫 develop2,可以执行:

git push origin develop:develop2

但一般不推荐这么做,不利于分支管理,很容易造成混乱。

git branch -d

有新建分支,那就肯定有删除分支,加入这个分支新建错了,或者 develop 分支的代码已经顺利合并到 master 分支来了,那么 develop 分支就没有用了,需要删除,这个时候执行git branch -d develop就可以把 develop 分支删除了。

git branch -D

有些时候可能分支删除失败,比如如果 develop 分支的代码还没有合并到 master 分支,你执行git branch -d develop是删除不了的,它会智能提醒你 develop 分支还有未合并的代码,但是如果你非要删除,那就执行git branch -D develop就可以强制删除 develop 分支了。

git branch -a

该命令可以查看本地仓库及远程仓库所有的分支

git push origin :develop

该命令用于删除远程分支,其中 origin 是远程仓库别名,develop 是分支,该命令及其危险,请慎重使用。

git checkout develop origin/develop

如果远程仓库有个 develop 分支,而本地没有,你想把远程 develop 分支同步到本地,可以使用该命令。

git checkout -b develop origin/develop

同样是同步远程 develop 分支到本地,顺便切换到 develop 分支

git tag

进行软件开发的时候经常有版本的概念,比如 v1.0、v1.1 之类的不同的版本肯定对应不同的代码,所以一般要给我们的代码加上标签,这样假设 v1.1 版本出了一个新 bug,但是又不晓得 v1.0 是否有这个 bug,有了标签就可以顺利切换到 v1.0 的代码,重新打个包测试了。
如果想要新建一个标签很简单,比如git tag v1.0就代表我在当前的代码状态下新建了一个 v1.0 的标签,输入git tag可以查看历史 tag 记录。
想要切换到某个 tag 也很简单执行git checkout v1.0,这样就顺利切换到 v1.0 tag 的代码状态了。


4. 提交代码到远程仓库

git remote

如果你想查看已关联的远程仓库,可以使用以下命令查看:

git remote -v

如果需要关联一个新的远程仓库,可以使用以下命令:

git remote add remote_depository depository_url

  • remote_depository:为远程仓库起个别名,一般第一个是 origin
  • depository_url:远程仓库的地址

git clone

如果本地没有建好的仓库,可以直接使用该命令直接复制远程仓库到本地,使用该命令不需要执行git init进行初始化,也不需要手动关联远程仓库,因为已经自动关联好了。

git clone depository_url

git config

使用以下命令可以在提交记录中显示你的用户名与邮箱:

git config --global user.name “developer”
git config --global user.email “developer@email.com”

git pull

如果有人提交代码到远程仓库,这个时候你需要把远程仓库的最新代码拉下来,保持两端代码同步,需要使用git pull命令。

git pull origin master

  • origin:远程仓库别名;
  • master:需要更新的分支。

git push

如果你的仓库有了新的提交记录,那么就需要把本地代码推送到远程仓库,这样就可以保持本地仓库跟远程仓库的同步了。

git push origin master

  • origin:远程仓库别名
  • master:需要推送的分支

5. Git 进阶

git diff

当我们要查看好几天前修改的代码,做了哪些改动已经记不清了,在提交前需要再确认一下,这个时候就可以输入git diff命令:

git diff [filename]

需要注意的是,这个命令只能比较你还没有git add的文件。除此之外,该命令还可以比较两个 commit 之间的差异,或者两个分支之间的差异。

git diff [commit1 [commit2]] # 比较两次提交之间的差异
git diff [branch1 [branch2]] # 在两个分支之间比较

git checkout

git checkout命令一般用于切换分支,比如:

git checkout develop

但该命令不止用于切换分支,可以用于切换 tag 或者切换到某个 commit,如:

git checkout v1.0
git checkout commit1

除了切换,checkout 还有撤销的作用。比如开发的时候有了很大的需求改动,原先的改动完全没用了,这个时候可以通过以下命令撤销文件的改动:

git checkout filename

git checkout命令只能撤销没有add进缓存区的文件。

git stash

当我们在一个新的分支上做新功能的开发,但是收到消息有一个 bug 需要切换分支进行紧急修复。但此时由于有文件被修改导致切换分支失败,而新功能还没做好你又不想提交,此时应该怎么办呢?

先执行以下命令:

git stash

该命令可以将未提交的代码(包括已经git add的文件)先暂存起来,这个时候你再执行git status会发现当前分支很干净,几乎没有改动。查看暂存区的记录,执行:

git stash list

你会发现暂存区已经有了一条记录,此时你就可以放心大胆地切换分支进行 bug 修复。修复完成后,你可以再次切换回新功能分支继续你的开发,执行以下命令还原暂存区的修改:

git stash apply

紧接着将暂存区的这条记录删除:

git stash drop

此外你也可以执行下面这条命令,取出并自动删除记录:

git stash pop

最后还有一条命令:

git stash clear

该命令用来清空缓存取所有的记录。

git merge & git rebase

merge 是合并的意思,当我们在分支 featureA 开发完一个功能后,需要合并到 develop分支上去,我们只需要执行以下操作:

git checkout develop # 切换到 develop 分支
git merge featureA # 将 featureA 分支合并过来

其实 rebase 命令也是合并的意思,可以通过类似的操作达到上述的目的:

git checkout develop
git rebase featureA

git merge可以明显看出各个提交记录分别来自哪个分支,但合并比较暴力;而git rebase将不同分支的提交进行比较,重新排列后自动合并好,但是很难看出各个提交记录分别来自哪个分支。

实际开发中不必过于纠结用哪种合并方式,从博主的开发经历来说,当项目比较复杂且多人开发的时候,推荐使用git merge,当需要追溯历史提交的时候,可以很方便地找到该提交对应的功能。

6. 解决冲突

当 A 和 B 同时开发两个不同功能模块,但由于都使用了基础库中某个方法,且都对该方法进行了修改。等两人把各自的功能做完后,先后提交到 develop 分支。假设 A 先合并,此时没有问题,合并成功。但 B 在合并的时候,该方法已经有了变化,即 A 和 B 同时对一个地方做了修改。git 不确定要以 A 的 commit 为准还是以 B 的 commit 为准,提示 conflicts,即冲突,这个时候就需要手动解决冲突后再进行一次 commit 提交。

<<<<<<< HEAD
This is A's commit.
=======
This is B's commit.
>>>>>>> featureB

上面代码块即是出现冲突的地方,=======将代码分成上下两块,上半部分HEAD表示的当前分支的代码,下半部分表示featureB这个分支的代码,此时我们需要认为需要判断哪部分保留,哪部分删除,或者对两个功能做兼容,随后再次进行提交。修改后如下:

if(isA())
	This is A's commit.
else if (isB())
	This is B's commit.

7. 分支管理

Git Flow 是一种比较成熟的分支管理流程,先看一张图来体会下它的工作流程:
在这里插入图片描述
一般来说,大部分情况下都会有 master 和 develop 这两个分支,它们的职责分别是:

  • master:永远处在即将发布(production-ready)的状态
  • develop:最新的开发状态

当项目准备上线的时候,会在 develop 分支上先进行测试,测试通过后,再合并到 master 分支上,并打上 tag。

但发布之后我们又会进行下一版本功能的开发,中间可能又会遇到需要紧急修复 bug 、一个功能开发完成之后突然需求出现变动等情况,所以 Git Flow 除了 master 和 develop 两个分支外,还提出了以下三个辅助分支:

  • feature:开发新的功能,基于 develop,开发完成后 merge 回 develop 分支
  • release:准备要发布版本的分支,用来修复 bug,基于 develop,完成后 merge 回 develop 和 master
  • hotfix:紧急修复 master 分支上的问题,等不及 release 版本必须马上上线
    。基于 master,完成后 merge 回 master 和 develop 分支

举个例子,假设我们已经有 master 和 develop 两个分支了,这个时候我们准备做一个功能,于是我们基于 develop 分支新建一个分支:

git branch feature/A

在开发过程中,发现线上有个重要 bug 需要紧急修复,于是我们马上切换到 master 分支,并在 master 基础上新建一个分支:

git branch hotfix/B

修复完成后直接合并到 master 和 develop 分支,紧接着发布。随后我们便可以切换回 feature/A 继续进行新功能开发。如果开发完了,合并回 develop 分支,然后在 develop 分支上的测试环境中测试,测试没什么问题后,准备 release。这个时候新建一个分支:

git branch release/1.0

基于该 release 分支,在正式环境中进行发布测试,期间遇到问题的时候,直接在该分支上进行修复。若测试通过达到发布标准,把该分支合并到 master 和 develop,然后发布。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值