如何进行分支管理
- Time:2020/3/17
写在前面:在上一份教程里,我们学习了基本的拉取和推送操作。但是作为最强大的版本控制工具,git最重要的功能之一是版本管理。在接下来的教程里我们着重进行分支管理的学习,同时学习一些git工具知识以及新的好用的命令。
在这次的教程里我使用了markdown文件格式,也希望大家能够借此机会学习md文件的编写,这对一个工程人员来说也是必要的技能。
这是我们这次教程的部分命令预览,当然远不仅此
git init Resp
git add .
git add file
git commit
git status
git log
git reset --hard
git reflog
git branch
git checkout
git diff
gitk
让我们开始吧
备注:$ 后面的命令是自己type的,其他的为git返回信息
首先我们找到我们的Android项目路径文件,然后用cd命令进入。注意不能有中文路径。
$ cd CustomAPI_testapp/
接下来我们在此目录下新建本地仓库,并将所有文件添加git暂存区
$ git init
Initialized empty Git repository in D:/Repository/CustomAPI_testapp/.git/
$ git add -A
The file will have its original line endings in your working directory
这下在这个文件夹里面就生成了一个.git目录,这个目录下就记录了我们新建仓库的信息
接下来我们设置一下远程的仓库,并试着推送
我们需要在Gitlab服务器新建一个Project,并且复制我们的ssh地址,然后使用git remote add 命令。然后查看远程和本地地址。
$ git remote add origin git@172.25.141.217:qiaodi/costomapi.git
$ git remote -v
origin git@172.25.141.217:qiaodi/costomapi.git (fetch)
origin git@172.25.141.217:qiaodi/costomapi.git (push)
以上两个地址相同表明我们本地仓库和remote仓库拉取和推送的仓库已经设置好了,仓库的默认名称是origin。接下来我们就可以commit了
$ git commit -m "First commit of CostomA"
[master (root-commit) ff58dfd] First commit of CostomA 43 files changed, 1226 insertions(+)
...
接下来我们进行推送。使用git push.
这个时候会报错,这是因为我们只是在本地默认设置了分支master,但是remote端的分支我们没有进行设置。
于是尝试使用系统推荐的命令git push --set-upstream origin master.
这个命令的意思是将本地的分支推送到远程,并且远端的分支名字与本地相同,都为master。而本地的master则是在新建仓库的时候默认的名字,当然也可以更改分支名字。如下:
$ git push
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin master
$ git push --set-upstream origin master
Enumerating objects: 77, done.
Counting objects: 100% (77/77), done.Delta compression using up to 8 threads Compressing objects: 100% (62/62), done.
Writing objects: 100% (77/77), 126.42 KiB | 3.33 MiB/s, done.
Total 77 (delta 2), reused 0 (delta 0)
To 172.25.141.217:qiaodi/costomapi.git
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
这个时候我们就会发现远程的仓库已经上传成功了,并且默认新建了分支master
我们试着用git log命令查看推送日志
$ git log
commit ff58dfd151672e68b9c9b52ad8920c39688bb503 (HEAD -> master, origin/master)
Author:
Date: Tue Mar 17 10:18:45 2020 +0800
First commit of CostomA
其中ff58dfd开头的一长串的是我们这次commit的哈希值。后面我们会用到这个进行版本回退处理。
多人协作开发
可以这样说,如果是个人开发,那么git工具的作用其实微乎其微。但是在面对多人开发的时候,git工具的强大之处就能发挥的淋漓尽致了。接下来我们进行多人协同开发模式的教学,以适应我们进行API的开发项目。
Let’s get it started!正片开始!
经过以上的设置,在本地建立好仓库,添加远程仓库地址等之后,我们基础的配置已经完成了,接下来我们会很容易进行以下内容。本节我们待实现的内容是:
- 多人协同开发同一份工程
- 每个人随时获取工程上的内容,并合并到自己的分支上
- 每个人随时上传自己工程上自己修改的内容
在前面我们已经知道从远程下载代码和从本地push代码的命令了。
我们使用命令:
git clone git@172.25.141.217:qiaodi/costomapi.git
命令进行clone,这条命令能够clone工程里面所有的文件。
我们使用命令:
git push origin master
进行代码的整个push。但是事实上使用push方法推送的只是本地上修改过的文件。并非全部工程文件。而修改过的文件则是使用命令git add . 进行添加的,这条命令的意思是将修改的文件加入暂存区,在使用commit命令的时候则对暂存区的文件进行commit,然后push。
大家可能注意到在上面的教程中我使用了命令:
git add -A
这条命令的意思是将所有的文件都加入暂存区,理解两个命令的区别。
那么有没有命令能将云端的代码同样的方法进行下载呢?当然是有的。我们在刚上传的工程app/src/main/java/com/dfl/hvac/中添加一个test.java文件。然后使用以下命令git fetch命令。此命令会新建一个origin/master分支(此分支不是广义的分支)
$ git fetch origin master
remote: Enumerating objects: 18, done.
remote: Counting objects: 100% (18/18), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 10 (delta 2), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (10/10), done.
From 172.25.141.217:qiaodi/costomapi
* branch master -> FETCH_HEAD
ff58dfd..32cc9bd master -> origin/master
然后使用git diff命令查看
$ git diff origin/master
diff --git a/app/src/main/java/com/dfl/hvac/test.java b/app/src/main/java/com/dfl/hvac/test.java
deleted file mode 100644
index e69de29..0000000
可以看到提示信息说明我们有一个文件发生了更改。在这里如果多人协作开发必须确认一下发生修改的文件是什么文件,是否是和自己相关的文件。因为这样的操作再进行分支合并之后会覆盖自己的文件的。
确认无误后使用命令进行合并操作
$ git merge origin/master
Updating ff58dfd..32cc9bd
Fast-forward
app/src/main/java/com/dfl/hvac/test.java | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 app/src/main/java/com/dfl/hvac/test.java
再回到本地会发现在相应的文件夹下面多了test.java文件。
运用此方法会方便的进行代码的多人协同开发:
项目负责人新建一个空工程,建好相关的空文件夹,然后安排不同的人开发不同的模块代码,大家共同编辑同一个工程。
但是请注意以下几点:
- 每个人都可以修改别人的文件,为此需要小心不要修改
- 拉取代码时需要进行版本对比,确定自己的代码时候修改
- 如以上情况发生,务必使用版本控制进行回退
在项目负责人新建空工程的时候也需要注意Android代码里面各个gitignore文件的内容,这个文件限定了git工具代码的上传,因为那些代码并非必要。但是作为一个完整的工程来说,最好放在上面,否则代码可能不全。
分支管理与版本回退
导读: 这一节主要讲解利用git工具进行版本管理和相关的分支管理等内容。
我们试着新建一个分支,并查看分支:
$ git branch newbranch
$ git branch -v
* master 32cc9bd Add new file
newbranch 32cc9bd Add new file
我们已经新建了一个分支了。然后我们切换分支进行编辑:
$ git checkout newbranch
witched to branch 'newbranch'
这个时候我们进行的任何commit(不进行push)都会在newbranch这个分支下进行。(只要我们不push,则所有的操作都是在本地进行,不会改变云端的数据)
我们试着在本地仓库根目录下新建一个内容只有1的文件,然后进行add和commit。
$ echo 1 >> testfile
$ git commit -m "branch test"
[newbranch 025ffc6] branch test
2 files changed, 1 insertion(+)
create mode 100644 FETCH_HEAD
create mode 100644 testfile
提示我们有两个文件发生了更改,其中一个是我们新建的,另一个git是自动生成的文件,在此不做过多探究,感兴趣的话可以了解一下HEAD(分支指针)在git中的作用。
打印日志
$ git log
commit 025ffc6436dcb1554a95e53d53c5d2c1e7008703 (HEAD -> newbranch)
Author:
Date: Tue Mar 17 14:02:55 2020 +0800
branch test
commit 32cc9bd60a71bbab6c9dab3ae57f88b9ef56174b (origin/master, master)
Author:
Date: Tue Mar 17 11:05:06 2020 +0800
Add new file
commit ff58dfd151672e68b9c9b52ad8920c39688bb503
Author:
Date: Tue Mar 17 10:18:45 2020 +0800
First commit of CostomA
最上面的一个commit是我们最近进行的操作,如果想进行本地commit回退的话,比如说回退到第二个commit,使用如下命令,其中后面的数字是每次提交的哈希码(因为哈希码重复概率很小,所以只用前几位表示整个哈希码了)。
$ git reset --hard 32cc9bd
HEAD is now at 32cc9bd Add new file
此时在你commit的版本中就回退到上一次commit了。(在此之前注意不要进行push,push的内容是commit的内容,commit的内容进行版本回退再进行push就可以对云端版本进行更改,不理解没关系,这涉及到git工具底层的工作流程,有兴趣可以查阅相关资料)我们在进行git log一下,会发现最上面的一个commit已经没了,只剩下两个commit。
如果后悔进行版本回退,我们使用如下代码,然后操作同上:
$ git reflog
我们新建了一个newbranch分支,如何上传呢?我们现在在newbranch分支下进行git push会报错,因为remote没有相应的分支。上面讲过,使用
$ git push --set-upstream origin newbranch
此时查看结果,在服务器上可以看到有了一个newbranch分支,并且在该分支下有testfile文件
至此,本地分支管理的基本用法已经介绍完了。更多的内容还请大家灵活运用。接下来我们补充内容: clone指定分支。
$ git clone <远程仓库地址>
这条命名默认clone的是master分支的内容。如果要clone制定分支可以试试 新建一个本地仓库,然后使用如下命令:
$ git clone -b <指定分支名> <远程仓库地址>
Android的.gitignore文件
git工具进行版本管理时会读取.gitignore文件,并将.gitignore文件中的内容排除在外,因为这些内容是编译器自动生成的文件并且量很大,所以为了减少时间经常把这部分内容排除在版本控制之外。这也是为什么上传工程之后代码占用存储大大减少的原因。我们也可自定义添加里面内容,更加方便地进行版本管理。
app/.gitignore中的内容:
/build
我们可以添加上:
/build
/src/test
等类似的内容灵活控制管理自己代码。
其他小技巧
$ gitk
灵活地打开git的GUI版本,在View视图中添加新视图可以观察到自己commit的可视化信息。
$ git log
可以灵活使用打印日志,进行相关问题追踪。
$ git status
可以灵活查看当前状态,包括文件增删查改等,信息一目了然。
其他:To be continued