Git 版本控制工具 基本教程

目录

一、介绍

1、安装 Git

二、使用

1.创建代码仓库

2.提交本地代码

3.忽略文件

4.查看修改内容

5.撤销未提交的修改

6. 查看提交记录

7. 分支的用法

8. 与远程版本库协作

9. 将代码托管到GitHub

10.版本回退

11 revert 合并代码,解决冲突


一、介绍

Git 是一个开源的分布式版本控制工具,它的开发者就是鼎鼎大名的 Linux 操作系统的作者 Linus Torvalds。

Git 被开发出来的初衷本是为了更好地管理 Linux 内核,而现在却早已被广泛应用于全球各种大中小型的项目中。

1、安装 Git

(1)Ubuntu 命令输入:sudo apt-get install git-core,按下回车后输入密码,即可完成 Git 的安装

(2)Windows 系统:

 git官网下载链接,下载自己操作系统对应的版本,然后运行安装就可以了。

二、使用

以下用win10的系统,安卓项目SettingSwitch,介绍使用

1.创建代码仓库

运行git-bash

(1)配置身份

这样提交代码的时候Git就知道是谁提交的了,命令如下:

git config --global user.name "Liang"
git config --global user.email "[email protected]"

查看是否配置成功:

git config --global user.name
git config --global user.email

(2)创建代码仓库

仓库(Repository)是用于保存版本管理所需信息的地方,所有本地提交的代码都会被提交到代码仓库中,

如果有需要还可以再推送到远程仓库中。

假设我们有一个项目SettingSwitch,则首先需要通过git进入到项目目录

然后在这个目录下输入 git init,就可以完成创建代码仓库的操作

git init

仓库创建完成后,会在项目SettingSwitch的根目录下生成一个隐藏的.git文件夹,这个文件夹就是用来记录本地所有的 Git 操作的,可以通过 ls -al 命令来查看一下.

2.提交本地代码

代码仓库建立完之后就可以提交代码了,只需要使用add 和 commit 命令就可以了。

add 是用于把想要提交的代码先添加进来,而 commit 则是真正地去执行提交操作。

比如我们想添加 AndroidManifest.xml 文件,就可以输入如下命令:

git add AndroidManifest.xml

这是添加单个文件的方法,那如果我们想添加某个目录呢?

其实只需要在 add后面加上目录名就可以了。

比如将整个 src 目录下的所有文件都进行添加,就可以输入如下命令:

git add src

一次性把所有的文件都添加好

命令如下所示:(注意末尾有个英文点)

git add .

文件都已经添加好了,来提交
输入如下命令:

git commit -m "First commit."

注意在 commit 命令的后面一定要通过-m 参数来加上提交的描述信息,没有描述信息的提交被认为是不合法的。

这样所有的代码就已经成功提交了!

3.忽略文件

提交之前你可能会发现一部分文件不需要提交。

Git 提供了一种可配性很强的机制来允许用户将指定的文件或目录排除在版本控制之外,

它会检查代码仓库的根目录下是否存在一个名为.gitignore 的文件,

如果存在的话就去一行行读取这个文件中的内容,并把每一行指定的文件或目录排除在版本控制之外。

注意.gitignore中指定的文件或目录是可以使用“*”通配符的。

其实在你git init创建仓库的时候就已经生成.gitignore文件了,里面自动给你忽略了一些不必要的文件。

现在,我们在SettingSwitch项目的根目录下创建一个名为.gitignore 的文件,

然后编辑这个文件中的内容,如图 7.8 所示。

表示把 bin 目录和 gen 目录下的所有文件都忽略掉,从而使用得它们不会加入到版本控制当中。

排除了 bin 和 gen 这两个目录以后,我们就可以提交代码了,先使用 add 命令将所有的文件进行添加,如下所示:

git add .

然后执行 commit 命令完成提交,如下所示:

git commit -m "First commit."

4.查看修改内容

在进行了第一次代码提交之后,我们后面还可能会对项目不断地进行维护,添加新功能等。

比较理想的情况是每当完成了一小块功能,就执行一次提交。

但是当某个功能牵扯到的代码比较多的时候,有可能写到后面的时候我们就已经忘记前面修改了什么东西了。

遇到这种情况时不用担心,Git 全部都帮你记着呢!

(1)查看文件修改情况

查看文件修改情况的方法非常简单,只需要使用 status命令就可以了,

在项目的根目录下输入如下命令:

//查看文件修改情况
git status

然后 Git 会提示目前项目中没有任何可提交的文件,因为我们刚刚才提交过嘛。

现在对项目中的Manifest文件增加一行注释:

重新输入git status,结果如下

(2)查看更改内容:

//查看所有文件更改内容
git diff 

//查看指定文件修改内容
git diff src/main/AndroidManifest.xml

效果如下:减号代表删除的部分,加号代表添加的部分)

5.撤销未提交的修改

有的时候我们代码可能会写得过于草率,以至于原本正常的功能,结果反倒被我们改出了问题。

遇到这种情况时也不用着急,因为只要代码还未提交,所有修改的内容都是可以撤销的。

(1)撤销未提交文件的修改

比如刚才修改了 AndroidManifest,现在如果想要撤销这个修改就可以使用 checkout命令,

用法如下所示:

// 撤销修改
git checkout src/main/AndroidManifest.xml

重新运行 git status 命令检查一下,可以看到,当前项目中没有任何可提交的文件,说明撤销操作确实是成功了。

不过这种撤销方式只适用于还没有执行 add 命令的文件,如果文件已经被添加了,这种方式就无法撤销其更改的内容。

测试:

仍在AndroidManifest中,加一行注释

然后提交 git add .

最后撤销修改 git checkout src/main/AndroidManifest.xml

然后检查,你会发现AndroidManifest没有被还原。不过执行的撤销命令并没有任何错误提示。

(2)撤销提交文件的修改

对于已添加的文件我们应该先对其取消添加,然后才可以撤回提交,取消添加使用的是 reset命令,

用法如下所示

// 撤销添加的文件
git reset HEAD src/main/AndroidManifest.xml

然后执行撤销命令git checkout src/main/AndroidManifest.xml 

撤销成功。

6. 查看提交记录

项目开发了几个月之后,我们可能已经执行过上百次的提交操作了,这个时候估计你早就已经忘记每次提交都修改了哪些内容。不过Git 一直都帮我们清清楚楚地记录着呢!

可以使用 log 命令查看历史提交信息,用法如下所示:

// 查看提交记录
git log

可以看到,每次提交记录都会包含提交 id、提交人、提交日期,以及提交描述这四个信息。

如果我们只想查看其中一条记录,可以在命令中指定该记录的 id,并加上-1 参数表示我们只想看到一行记录。

// 根据 id 查看提交 注意末尾是数字1
git log 5f6db118f15930bfad16fa0d3ac546d213c4fa9b -1

查看这条提交记录具体修改了什么内容,可以在命令中加入-p参数

// 查看提交的内容
git log 5f6db118f15930bfad16fa0d3ac546d213c4fa9b -1 -p

其中减号代表删除的部分,加号代表添加的部分。

7. 分支的用法

分支是版本控制工具中比较高级且比较重要的一个概念,它主要的作用就是在现有代码的基础上开辟一个分叉口,使得代码可以在主干线和分支线上同时进行开发,且相互之间不会影响。

分支的工作原理示意图

为什么需要建立分支呢,只在主干线上进行开发不是挺好的吗?

没错,通常情况下,只在主干线上进行开发是完全没有问题的,不过一旦涉及到出版本的情况,如果不建立分支的话,你就会非常地头疼。

举个简单的例子吧,比如说你们公司研发了一款不错的软件,最近刚刚完成,并推出了 1.0 版本。但是领导是不会让你们闲着的,马上提出了新的需求,让你们投入到了 1.1 版本的开发工作当中。过了几个星期,1.1 版本的功能已完成了一半,但是这个时候有用户反馈,之前上线的 1.0 版本发现了几个重大的 bug,严重影响软件的正常使用。领导也相当重视这个问题,要求你们立刻修复这些 bug,并重新发布 1.0版本,但这个时候你就非常为难了,你会发现根据没法去修复这些 bug。因为现在 1.1 版本已开发一半了,如果在现有代码的基础上修复这些 bug,那么更新的 1.0 版本将会带有一半1.1版本的功能!

进退两难了是不是?但是如果你使用了分支的话,就完全不会存在这个让人头疼的问题。你只需要在发布 1.0 版本的时候建立一个分支,然后在主干线上继续开发 1.1 版本的功能。当 1.0 版本上发现任何 bug 的时候,就在分支线上进行修改,然后发布新的 1.0 版本,并记得将修改后的代码合并到主干线上。

这样的话,不仅可以轻松解决掉1.0版本存在的bug,而且保证了主干线上的代码也已经修复了这些 bug,当 1.1 版本发布时就不会有同样的 bug存在了。

(1)查看分支

查看当前的版本库当中有哪些分支、

/查看分支
git branch –a 

由于目前 SettingSwitch 项目中还没有创建过任何分支,因此只有一个 master 分支存在,即主干线。

(2)创建分支

创建一个分支:

// 创建分支
git branch version1.0

这样就创建了一个名为 version1.0 的分支,我们再次输入 git branch –a 这个命令来检查一下

master 分支的前面有一个*号,说明目前我们的代码还是在 master 分支上的

(3)切换分支

切换到 version1.0分支

// 切换到 version1.0
git checkout version1.0

再次输入 git branch –a来进行检查

(4)合并分支

在 version1.0 分支上修改并提交的代码将不会影响到 master 分支。

在 master 分支上修改并提交的代码也不会影响到 version1.0 分支。

因此,如果我们在 version1.0 分支上修复了一个 bug,在 master 分支上这个 bug 仍然是存在的。

这时要将修改的代码合并到主干线上,使用 merge命令来完成合并操作,如下所示:

// 将分支合并到主干线
git checkout master
git merge version1.0

在合并分支的时候还有可能出现代码冲突的情况,Git 在这里就无法帮助你了。

(5)删除分支

当需要 version1.0这个分支的时候,可以删除分支:

// 删除分支
git branch -D version1.0

8. 与远程版本库协作

如果是一个人在开发,那么使用版本控制工具就远远无法发挥出它真正强大的功能。

没错,所有版本控制工具最重要的一个特点就是可以使用它来进行团队合作开发。

每个人的电脑上都会有一份代码,当团队的某个成员在自己的电脑上编写完成了某个功能后,就将代码提交到服务器,其他的成员只需要将服务器上的代码同步到本地,就能保证整个团队所有人的代码都相同的。

这样的话,每个团队成员就可以各司其职,大家共同来完成一个较为庞大的项目。

那么如何使用 Git 来进行团队合作开发呢?

这就需要有一个远程的版本库,团队的每个成员都从这个版本库中获取到最原始的代码,然后各自进行开发,并且以后每次提交的代码都同步到远程版本库上就可以了。

另外,团队中的每个成员最好都要养成经常从版本库中获取最新代码的习惯,

不然的话,大家的代码就很有可能经常出现冲突。

比如说现在有一个远程版本库的 Git 地址是 https://github.com/exmaple/test.git,就可以使

(1)下载远程代码

将代码下载到本地:

// 将代码下载到本地
git clone https://github.com/exmaple/test.git

(2)把本地修改的内容同步到远程版本库

git push origin master

其中origin 部分指定的是远程版本库的 Git 地址,master 部分指定的是同步到哪一个分支上,上述命令就完成了将本地代码同步到 https://github.com/exmaple/test.git 这个版本库的master分支上的功能。

(3)将远程版本库上的修改同步到本地fetch

Git 提供了两种命令来完成此功能,分别是 fetch 和 pull,fetch 的语法

git fetch origin master

执行这个命令后,就会将远程版本库上的代码同步到本地,

不过同步下来的代码并不会合并到任何分支上去,而是会存放在到一个 origin/master 分支上,

这时我们可以通过 diff 命令来查看远程版本库上到底修改了哪些东西:

git diff origin/master

之后再调用 merge 命令将 origin/master 分支上的修改合并到主分支上即可,如下所示:

git merge origin/master

(4)将远程版本库上的修改同步到本地pull

 pull 命令则是相当于将 fetch 和 merge 这两个命令放在一起执行了,它可以从远程版本库上获取最新的代码并且合并到本地,用法如下所示

git merge origin/master

9. 将代码托管到GitHub

GitHub地址

进入github注册一个个人免费账户。

(1)创建远程仓库

然后我们可以点击右下角的 New repository 按钮来创建一个版本库,

这里将版本库命名为 Test,然后选择添加一个 Android 项目类型的.gitignore 文件,并使用 Apache v2 License 来作为代码的开源协议

接着点击 Create repository 按钮,coolweather这个版本库就创建完成了。

版本库主页地址是https://github.com/0729Liang/Test

可以看到,GitHub 已经自动帮我们创建了.gitignore、LICENSE 和 README.md 这三个文件,其中编辑 README.md 文件中的内容可以修改我们项目版本库主页的描述。

(2)远程版本库克隆到本地

我们需要将远程版本库克隆到本地。首先必须知道远程版本库的 Git 地址。

在项目版本库主页的右下角找到

点击右边的复制按钮可以将版本库的 Git 地址复制到剪贴板,

Git 地址是 https://github.com/0729Liang/Test.git

然后打开 Git Bash 并切换到 实际项目SettingSwitch的工程目录下,接着输入

git clone https://github.com/0729Liang/Test.git

来把远程版本库克隆到本地。

看到图中所给的文字提示就表示克隆成功了,并且.gitignore、LICENSE 和 README.md这三个文件也已经被复制到了本地。

可以进入到 Test目录,并使用 ls –al 命令查看。

现在我们需要将这个目录中的所有文件全部复制到上一层目录中,这样就能将整个Test工程目录添加到版本控制中去了。

注意.git 是一个隐藏目录,在复制的时候千万不要漏掉。复制完之后可以把 Test目录删除掉。

(3)项目提交到 GitHub 上

接下来我们应该把 SettingSwitch项目中现有的文件提交到 GitHub 上面
先将所有文件添加到版本控制中,如下所示:

git add .

然后在本地执行提交操作:

git commit -m "First commit."

最后将提交的内容同步到远程版本库

git push origin master

注意,最后一步的时候 GitHub 要求输入用户名和密码来进行身份校验

这样就已经同步完成了,现在刷新一下github项目版本库的主页,你会看到刚才提交的那些文件已经存在了。

10.版本回退

(1)本地版本回退

假设之前我分别提交了两次,

第一次:修改Manifest文件,加入注释 //11111111111

第二次:将注释 //11111111改为 //2222222

我们先查看提交记录

// 查看提交记录
git log

之后查询提交记录

git reflog

蓝色区域部分就是你每次提交的commit-id。

版本回退:

git reset --hard commit-id  //回滚到commit-id,讲commit-id之后提交的commit都去除
git reset --hard HEAD~3 //将最近3次的提交回滚

比如我们当前的Manifest文件如下:

回退到上一个版本:

Manifest中的内容则会同步回退

(2)公共远程分支版本回退的问题

一个显而易见的问题:如果你回退公共远程分支,把别人的提交给丢掉了怎么办?

下面来分析:

假如你的远程master分支情况是这样的:

A1–A2–B1

其中A、B分别代表两个人,A1、A2、B1代表各自的提交。并且所有人的本地分支都已经更新到最新版本,和远程分支一致。

这个时候你发现A2这次提交有错误,你用reset回滚远程分支master到A1,那么理想状态是你的队友一拉代码git pull,他们的master分支也回滚了,然而现实却是,你的队友会看到下面的提示:

$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)
nothing to commit, working directory clean

也就是说,你的队友的分支并没有主动回退,而是比远程分支超前了两次提交,因为远程分支回退了嘛。

(1) 这个时候你虽然回退版本了,但是你覆盖掉了你队友B的提交,也就是B1那次提交

然后你队友B可以使用下面的命令来找出你回退版本后覆盖掉的他的提交: 

git reflog

然后冷静的把自己的分支回退到那次提交,并且拉个分支:

git checkout tony_branch        //先回到自己的分支  
git reflog                      //接着看看当前的commit id,例如:0bbbbb    
git reset --hard B1             //回到被覆盖的那次提交B1
git checkout -b tony_backup     //拉个分支,用于保存之前因为回退版本被覆盖掉的提交B1
git checkout tony_branch        //拉完分支,迅速回到自己分支
git reset --hard 0bbbbbb        //马上回到自己分支的最前端

这样B1那次提交找回来了,这时tony_backup分支最新的一次提交就是B1,接着Tony要把自己的本地master分支和远程master分支保持一致:

git reset --hard origin/master

执行了上面这条命令后,B的master分支才真正的回滚了,也就是说你的回滚操作才能对B生效,这个时候B的本地maser是这样的:

A1

接着B要再次合并那个被丢掉的B1提交:

git checkout master             //切换到master
git merge tony_backup           //再合并一次带有B1的分支到master

好了,B终于长舒一口气,这个时候他的master分支是下面这样的:

A1 – B1

终于把丢掉的B1给找回来了,接着他push一下,你一拉也能同步。

同理对于所有队友也要这样做,但是如果该队友没有提交被你丢掉,那么他拉完代码git pull之后,只需要强制用远程master覆盖掉本地master就可以了

git reset --hard origin/master

(2) 然而很不幸的是,现实中,我们经常遇到的都是猪一样的队友,他们一看到下面提示:

$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)
nothing to commit, working directory clean

就习惯性的git push一下,或者他们直接用的SourceTree这样的图形界面工具,一看到界面上显示的是推送的提示就直接点了推送按钮,卧&槽,你辛辛苦苦回滚的版本就这样轻松的被你猪一样的队友给还原了,所以,只要有一个队友push之后,远程master又变成了:

A1 – A2 – B1

这就是分布式,每个人都有副本。这个时候你连揍他的心都有了,怎么办呢?你不能指望每个人队友都是git高手,下面我们用另外一种方法来回退版本。

注意:博主是在虚拟机中实验的,用于模拟两个人的操作,如果你在一个机器上,用同一个账号在不同的目录下克隆两份代码来实验的话,回退远程分支后,另外一个人是不会看到落后远程分支两次提交的,所以请务必使用虚拟机来模拟A、B两个人的操作

(3) 公共远程分支版本回退的方法

使用git reset回退公共远程分支的版本后,需要其他所有人手动用远程master分支覆盖本地master分支,显然,这不是优雅的回退方法,下面我们使用另个一个命令来回退版本:

git revert HEAD                     //撤销最近一次提交
git revert HEAD~1                   //撤销上上次的提交,注意:数字从0开始
git revert 0ffaacc                  //撤销0ffaacc这次提交

git revert 命令意思是撤销某次提交。它会产生一个新的提交,虽然代码回退了,但是版本依然是向前的,所以,当你用revert回退之后,所有人pull之后,他们的代码也自动的回退了。 
但是,要注意以下几点:

  1. revert 是撤销一次提交,所以后面的commit id是你需要回滚到的版本的前一次提交
  2. 使用revert HEAD是撤销最近的一次提交,如果你最近一次提交是用revert命令产生的,那么你再执行一次,就相当于撤销了上次的撤销操作,换句话说,你连续执行两次revert HEAD命令,就跟没执行是一样的
  3. 使用revert HEAD~1 表示撤销最近2次提交,这个数字是从0开始的,如果你之前撤销过产生了commi id,那么也会计算在内的。
  4. 如果使用 revert 撤销的不是最近一次提交,那么一定会有代码冲突,需要你合并代码,合并代码只需要把当前的代码全部去掉,保留之前版本的代码就可以了.

git revert 命令的好处就是不会丢掉别人的提交,即使你撤销后覆盖了别人的提交,他更新代码后,可以在本地用 reset 向前回滚,找到自己的代码,然后拉一下分支,再回来合并上去就可以找回被你覆盖的提交了。

11 revert 合并代码,解决冲突

使用revert命令,如果不是撤销的最近一次提交,那么一定会有冲突,如下所示:

<<<<<<< HEAD
全部清空
第一次提交
=======
全部清空
>>>>>>> parent of c24cde7... 全部清空

解决冲突很简单,因为我们只想回到某次提交,因此需要把当前最新的代码去掉即可,也就是HEAD标记的代码:

<<<<<<< HEAD
全部清空
第一次提交
=======

把上面部分代码去掉就可以了,然后再提交一次代码就可以解决冲突了。

参考链接:https://blog.csdn.net/fuchaosz/article/details/52170105

猜你喜欢

转载自blog.csdn.net/jinmie0193/article/details/81564360