每天3分钟玩转Git—— 02 – 提交代码同步代码、分支操作

小熊 玩转Git评论2,9891字数 4304阅读14分20秒阅读模式

02 - 提交代码同步代码、分支操作

摘要:完成本系列文章的阅读以后,你将掌握git的基本概念与git的基本命令,可以在本地随心所欲的完成代码的提交撤销保存修改等操作、可以流畅的参与多人协作,让我们快点来学习吧!

上集回顾:
经过上一次的学习,传送门 --> Git 版本控制,看这篇就够了 (一)我们学会了下以内容,如果还不会的同学赶快补补课。

  • Git的基本概念

  • 知道了git的作用、历史;

  • 学会安装配置Git,使用Git创建项目托管以及工作区和暂存区的概念

我们这一次是一次孤独的版本控制管理,因为这次只有一个人孤军奋战,等下一次我们就可以体验到多人协作的魅力啦!
本文核心点:

  • 如何在本地提交你的代码(创建、修改、删除文件)

  • 如何优雅的拉代码(拉代码的两种方式pull、fetch)

  • 什么是分支以及分支操作 (创建、切换、删除分支)

如何在本地提交你的代码

还记得上次我们学习了工作区、版本库、暂存区的概念,我们使用了淘宝商家、私人管家、私人仓库来举例,这一节我们还是用他们来举例,你在本地随心所欲的写代码,你会创建新的文件、修改历史文件、甚至不满意了就删掉两个文件这些都是可以的,因为你是老大听你的。

你养了一个管家他就是你的本地版本仓库,躲在根目录下面,是名字叫 .git的一个隐藏文件夹,本地的所有直接针对代码文件的操作都是在工作区完成的。

然后我们再用一系列命令给工作区的代码放到暂存区里,再通过一系列命令提交到版本库中去,并且在提交到版本库的过程中可以标记每次提交的代码是新增了什么功能、改了什么bug、删除了哪些文件;非常的直观舒服,请容我细细道来。

新文件与修改

$ ls
README.md

$ touch file1.txt

$ git add file1.txt

$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   file1.txt
$ git commit -m "[+]add new file1.txt"
[master 66cc488] [+]add new file1.txt
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 file1.txt

上图操作包含:

  • 创建新文件file1.txt

  • add 添加修改的内容到索引

  • status 查看修改的内容

  • commit 把索引提交到本地分支

git add . :监控工作区的状态树,此命令会把工作区的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件。
git add -u:他仅监控已经被add的文件(即tracked file),他会将被修改的文件提交到暂存区。add -u 不会提交新文件(untracked file)。(git add --update的缩写),我们在写一个的新的功能创建了一些新的代码文件,我们暂时不想提交这些代码,这种情况下就可以考虑此命令
git add -A :是上面两个功能的合集(git add --all的缩写),一般新创建和删除的文件都是要加到暂存区的,所以我们通常直接用这个命令就可以了。
每天3分钟玩转Git—— 02 – 提交代码同步代码、分支操作
git show 列出最近一次的提交

对于commit:像这样,你不断对文件进行修改,然后不断提交修改到版本库里,就好比玩RPG游戏时,每通过一关就会自动把游戏状态存盘,如果某一关没过去,你还可以选择读取前一关的状态。有些时候,在打Boss之前,你会手动存盘,以便万一打Boss失败了,可以从最近的地方重新开始。Git也是一样,每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。

删除文件

$ ls
README.md file1.txt
$ git rm file1.txt
rm 'file1.txt'
$ ls
README.md
$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
 deleted:    file1.txt
$ git commit -m "[-]delete file1.txt"
[master e278392] [-]delete file1.txt
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 file1.txt

上图操作包含:

  • 创建新文件file1.txt

  • git rm 删除file1.txt文件

  • status 查看修改的内容

  • commit 把索引提交到本地分支

tip1: 如果没有用git rm删除文件,在本地删除文件后,git add一下再提交可以达到同样的效果
tip2: 要是你加班太晚,头晕不小心删除了不想删除的文件怎么办?敬请期待以后的推送之后悔药

如何优雅的拉代码

方法一 pull

$ git pull
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From github.com:pzqu/git_test
   5fd4d8f..7b54a8a  master     -> origin/master
Merge made by the 'recursive' strategy.
 share_file.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 share_file.txt

上图命令:

  • git pull

查看本地仓库变化git log
每天3分钟玩转Git—— 02 – 提交代码同步代码、分支操作
上图可以看到向远程仓库pull的时候,出现了两个新的commit,commit 7b54a8ae74...的提交信息为Create share_file.txt,另一个commit fdbb19cf4c51770的提交信息为Merge branch 'master' of github.com:pzqu/git_test。事实上主线只有一个提交,为什么会出现这种情况? 是因为pull其实会做两个操作

  • 拉远程仓库代码到本地

  • 自动与当前分支合并并生成一个合并成功的提交

注意这里的第二个个步骤如果远程有人和你改了同一个文件就会出现一个冲突,这个时候git会提示你哪些文件有冲突,手动改了再提交一次就可以了。详情见合并冲突

方法二 fetch

我在远程修改了文件,向share_file.txt加了一行内容tom modify,此时拉代码。

$ git fetch
$ git rebase origin/master
First, rewinding head to replay your work on top of it...
Applying: [+]add new file1.txt
Applying: [-]delete file1.txt

上图所示有以下两个操作

  • fetch 拉取远端代码到本地

  • rebase 把本地代码提交基于远端分支重新replay

效果如下:
每天3分钟玩转Git—— 02 – 提交代码同步代码、分支操作

上图是git log所输出的提交内容,刚刚pull的时候忘记把pull自动产生的merge提交到远程,rebase的时候把本地的提交放到了远程提交之后,看起来就是一条直线,比较优雅,也是推荐的方式。
同样的,如果在拉代码的时候,有另一个人也向远程仓库提交了代码,恰好你们的代码都是修改的相同的文件,这就会发生一个冲突,必须要你来亲自决定哪些代码留下哪些代码删掉,详情我们会在以后的文章合并冲突和大家一起分析,这次我们摒弃杂念,只考虑一个人的情况下。

什么是分支以及分支操作 

创建分支

分支是多人协同最经典的地方所在,我们来创建一个分支

$ git checkout -b dev/pzqu origin/master
Branch 'dev/pzqu' set up to track remote branch 'master' from 'origin'.
Switched to a new branch 'dev/pzqu'
$ git branch
* dev/pzqu
  master
  • git checkout -b 分支名 其他分支,-b代表创建并切换到新建的分支,分支名代表新创建的分支叫什么名字,这里叫dev/pzqu ,其他分支代表基于哪一个分支来创建,这里基于远程的master分支origin/master,如果省略则代表基于当前分支

  • git branch展示本地的分支情况,加-a参数可以展示全部的分支,包括远程分支

  • *在分支前,指明了现在所在的分支是dev/pzqu

切换分支

$ git checkout -b dev/pzqu2
Switched to a new branch 'dev/pzqu2'
$ git branch
  dev/pzqu
* dev/pzqu2
  master
$ git checkout dev/pzqu
Switched to branch 'dev/pzqu'
Your branch is up to date with 'origin/master'.
$ git branch
* dev/pzqu
  dev/pzqu2
  master
  • 基于当前分支创建了一个新的分支并自动切换过去dev/pzqu2

  • git checkout 已存在的分支名切换分支回到dev/pzqu

删除分支

$ git branch
* dev/pzqu
  dev/pzqu2
  master

$ git branch -D dev/pzqu2
Deleted branch dev/pzqu2 (was 7c9be37).
$ git branch
* dev/pzqu
  master
  • 位于dev/pzqu,删除了dev/pzqu2分支

小结

今天的三分钟就到此结束了,通过本次的学习我们学会了

  1. 如何本地的工作区与暂存区之间提交你的代码(创建、修改、删除文件)

  2. 如何优雅的拉代码(拉代码的两种方式pull、fetch)

  3. 什么是分支以及分支操作 (创建、切换、删除分支)

下回预告:
下次我们将给大家带来多人使用Git时的代码版本控制奇淫技巧——(合并冲突、暂存代码)敬请期待哦~!

weinxin
公众号
扫码订阅最新深度技术文,回复【资源】获取技术大礼包
小熊