从0开始学习Git系列之「Git中阶」

远程管理

  1. 创建远程仓库
    是时候在github上创建一个远程仓库了。
    首先使用你的github账号登录,然后找到New repository这个按钮,点击创建远程仓库,repository name就取之前在本地建的仓库名,description随意。然后,只能选public即公有库(任何人都能看),要是你想拥有private私有库,就需要交费了。到此,你离成功只差最后一步,点击create repository按钮。好了,当页面跳转之后,就是你成功之时,但这时远程库是没有任何东西的。
  2. 关联本地仓库并推送至远程库
    跳转过来的页面是这样的,你可以根据提示,可以创建一个新的,而我们现在是需要push一个已经存在的库,所以命令如下:
$ git remote add origin https://github.com/haihaio/learn.git
$ git push -u origin master
Counting objects: 6, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (6/6), 439 bytes | 0 bytes/s, done.
Total 6 (delta 0), reused 0 (delta 0)
To https://github.com/haihaio/learn.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.

其中-u参数是第一次推送本地分支时需要添加的参数,目的是将本地分支与远程分支关联起来,简化之后的推送和拉取的命令。在之后的命令就只需要这样了:

$ git push origin master
  1. 克隆远程库
    当我们需要多人协同开发一个项目时,就只需要将已经创建好的库克隆下来就可以继续在本地开发,下边用之前我们创建的远程库,使用命令将其克隆下来:
$ git clone https://github.com/haihaio/learn.git
Cloning into 'learn'...
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 6 (delta 0), reused 6 (delta 0), pack-reused 0
Unpacking objects: 100% (6/6), done.
Checking connectivity... done.
$ ls -a
.   ..  learn
$ cd learn/
$ ls -a
.   ..  .git    me.md

进入克隆的目录,看一下是不是和远程库的一样呢?

分支管理

在实际的开发过程中,都会有一个主分支和一个属于自己的分支,这样既不会干扰同事的开发过程,也可以在自己的分支上随心所欲的提交,直到项目开发完成,最后合并到主分支上进行维护。
1. 创建与合并分支
在之前的学习中,我们使用git log来查看提交的历史记录,这记录就是一个(主)分支的一条时间线。现在我们需要创建一个属于自己的分支脱离主分支开发,最后与主分支合并。
(1)创建dev分支并切换至dev分支<参数-b表示创建分支,checkout是切换分支>

$ git checkout -b dev
Switched to a new branch 'dev'

或者使用:

$ git branch dev
$ git checkout dev
Switched to branch 'dev'

(2)查看当前分支
*所在位置即为当前所在分支。

注意:git branch是查看分支,git branch <分支名>是创建分支。

$ git branch
* dev
  master

(3)在dev(自己的分支)创建内容并提交至远程库

$ touch text.txt
$ git add .
$ git commit -m "add test.txt"
[dev 1cb026d] add test.txt
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 text.txt
 $ git push origin dex
error: src refspec dex does not match any.
error: failed to push some refs to 'https://github.com/haihaio/learn.git'
bogon:learn yihaimen$ git push origin dev
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 280 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/haihaio/learn.git
 * [new branch]      dev -> dev

现在,你可以在登录github,查看刚才的那个远程库,是不是有两个分支并且内容不一样了,如果是就说明“you got it”。
(4)将dev分支与主分支合并
将当前分支切换到主分支上来,使用git checkout命令:

$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
$ git branch
  dev
* master
$ ls -a
.   ..  .git    me.md

可以发现在主分支上并没有刚才创建的text.txt的文件,现在我们开始合并:

$ git merge dev
Updating c088a47..1cb026d
Fast-forward
 text.txt | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 text.txt

当我们合并完了之后,可以看到两个分支的内容是一样一样的。

$ ls -a
.       ..      .git        me.md       text.txt

git merge命令是指合并指定分支到当前分支,切勿弄错。

(5)删除dev分支
这个时候,我们不需要dev这个分支,就可以将其删除了:

$ git branch -d dev
Deleted branch dev (was 1cb026d).
$ git branch
* master

此时,就只有master这一个分支了。

解决冲突

  1. 按照刚学的命令,创建并切换一个分支,修改内容提交本地后切换至master分支。
$ git checkout -b dev1
Switched to a new branch 'dev1'
$ git branch
* dev1
  master
$ git add .
$ git commit -m "modify text"
[dev1 31a3e6b] modify text
 1 file changed, 1 insertion(+)
$ git push origin dev1
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 296 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/haihaio/learn.git
 * [new branch]      dev1 -> dev1
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)
$ git branch
  dev1
* master
  1. 修改master分支上text.txt的内容且与dev1的不一样,然后提交至本地。
$ git add .
$ git commit -m "master modify"
[master 7d99d37] master modify
 1 file changed, 1 insertion(+)


  1. 合并master分支与dev1分支

注:在这种情况下合并,肯定会出现冲突,需要手动去解决冲突。
$ git merge dev1
Auto-merging text.txt
CONFLICT (content): Merge conflict in text.txt
Automatic merge failed; fix conflicts and then commit the result.

看吧提示合并失败,打开text.txt会看到如下的样子。

<<<<<<< HEAD
fdsaxfsdafsdfads
=======
wo xii gar asfd 
>>>>>>> dev1

Git用<<<<<<<=======>>>>>>>标记出不同分支的内容,我们修改如下(与dev1的一样)后保存:

wo xii gar asfd

再提交,两个分支的内容就保持一致了。

$ git add .
$ git commit -m "merge" 

解决了冲突之后,我们就可以继续在自己的分支上提交代码或者删除自己的分支了,还记得删除的命令吗?自己试一试吧。
4. 禁用Fast forward模式
一般情况下,Git都是使用Fast forward模式,有一个弊端就是删除分支后会丢掉分支信息。我们禁用了Fast forward模式后,每次合并的时候都会产生一个新的提交,这样我们就可以看到分支信息了。使用上边创建的dev1分支做如下操作(手动修改text.txt中的内容):

$ git checkout dev1
Switched to branch 'dev1'
$ git branch
* dev1
  master
$ cat text.txt 
wo xii gar asfd 

add something
$ git add .
$ git commit -m "add something"
[dev1 d80939d] add something
 1 file changed, 3 insertions(+), 1 deletion(-)

现在切换到master分支并合并:

$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 4 commits.
  (use "git push" to publish your local commits)
$ git branch
  dev1
* master
$ git merge --no-ff -m "merge with no-ff" dev1
Auto-merging text.txt
CONFLICT (content): Merge conflict in text.txt
Automatic merge failed; fix conflicts and then commit the result.

因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。

下面使用git log(前面提到过,查看提交历史),现在我们用它查看合并历史的信息(--graph参数就是表示用曲线图表示):
简化版git log --graph --pretty=oneline --abbrev-commit:

$ git log --graph --pretty=oneline --abbrev-commit
*   c0f39ae merge
|\  
| * 31a3e6b modify text
* | 7d99d37 master modify
|/  
* 1cb026d add test.txt
* c088a47 add something
* d04ce7e me.md

详细版git log --graph:

$ git log --graph
*   commit c0f39ae173164bb8ac6981a175fd7ee873a76abf
|\  Merge: 7d99d37 31a3e6b
| | Author: xxx <xxxx@163.com>
| | Date:   Sun Sep 25 23:28:15 2016 +0800
| | 
| |     merge
| |   
| * commit 31a3e6bb074afde3417b3932f446f31a72f26925
| | Author: xxx <xxxx@163.com>
| | Date:   Sun Sep 25 15:19:59 2016 +0800
| | 
| |     modify text
| |   
* | commit 7d99d37d99c289ab09beb6e569d000958d764c99
|/  Author: xxx <xxxx@163.com>
|   Date:   Sun Sep 25 23:18:21 2016 +0800
|   
|       master modify
|  
* commit 1cb026d0171fc5b256c63a5767406e36c092b8ad
| Author: xxx <xxxx@163.com>
| Date:   Sun Sep 25 14:39:19 2016 +0800

bug分支

在开发完第一阶段后,我们将合并所有分支到主分支上,并出第一个版本。当我们的测试人员发现了主分支有一个bug,但我们正在自己的分支dev1上干活且需要2天时间干完才能提交,而老板要求1个小时内修复这个bug,这时我们就需要临时创建一个bug分支来修复那个bug了。
(1)隐藏当前工作环境
Git还提供了一个stash功能,可以把当前工作现场“隐藏”起来,等以后恢复现场后继续工作:

$ git stash
No local changes to save

看一下当前状态,是否有内容没有提交:

$ git status
On branch dev1
nothing to commit, working directory clean

可以看到工作环境干净,下面就可以在master分支上创建临时的bug分支了,首先切换到master分支然后创建临时分支:

$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 6 commits.
  (use "git push" to publish your local commits)
$ git checkout -b bug1
Switched to a new branch 'bug1'

(2)修复bug合并至主分支并删除临时分支
我们模拟修改,我是添加了一句中文。

$ cat text.txt 
wo xii gar asfd 
我是来修复bug的
$ git add .
$ git commit -m "deal bug"
[bug1 e9c264d] deal bug
 1 file changed, 1 insertion(+), 5 deletions(-)

切换到主分支完成合并:

$ git merge --no-ff -m "deal bug" bug1
Merge made by the 'recursive' strategy.
 text.txt | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

删除临时分支:

$ git branch -d bug1
Deleted branch bug1 (was e9c264d).

(3)返回自己的分支干活
切换到自己的分支并恢复之前的工作环境:

$ git checkout dev1
Switched to branch 'dev1'
$ git status
On branch dev1
nothing to commit, working directory clean

工作区是干净的,这里我们使用新的命令git stash list进行查看并使用新的命令git stash pop进行恢复:

$ git stash list
$ git stash pop

如果你多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash:

$ git stash apply stash@{0}

补充:如果这个bug是因为测试人员错误的测试操作造成的,且临时建的bug1分支还没有被合并就得立即被删除了,回想之前学习的,我们会使用如下命令:

$ git branch -d bug1
error: The branch 'bug1' is not fully merged.
If you are sure you want to delete it, run 'git branch -D bug1'.

根据提示,因为bug分支还没有被合并,要是强行删除,需要用大写的-D参数。

$ git branch -D bug1
Deleted branch bug1 (was 756d4af).

(4)查看远程库的信息
命令如下:
简单的

$ git remote
origin

详细的

$ git remote -v
origin  https://github.com/haihaio/learn.git (fetch)
origin  https://github.com/haihaio/learn.git (push)

标签管理

(1)创建标签与查看标签
切换到需要打标签的分支上然后打标签。

$ git branch
* dev1
  master
$ git checkout master
$ git tag v1.0

查看标签是否打上:

$ git tag
v1.0

我们还可以根据commit_id来打标签,就好比之前的某次提交需要打标签,却忘记了,之后又提交了多次。首先就是找到commit_id:

$ git log --pretty=oneline --abbrev-commit
079c6ce deal bug
e9c264d deal bug
bbd89ec i dont knoe
d80939d add something
c0f39ae merge
7d99d37 master modify
31a3e6b modify text
1cb026d add test.txt
c088a47 add something
d04ce7e me.md

打标签并查看:

$ git tag v0.8 bbd89ec
$ git tag
v0.8
v1.0

还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:

$ git tag -a v0.5 -m "v0.5 tag" d04ce7e
$ git tag
v0.5
v0.8
v1.0

还可以查看指定的标签信息:

$ git show v1.0
commit 079c6ceca6fab28eb0d8d0b73f7d2edc2bd0cccc
Merge: bbd89ec e9c264d
Author: xxx <xxxx@163.com>
Date:   Mon Sep 26 00:29:22 2016 +0800

    deal bug

(2)删除标签
要是一个不小心,打错了标签怎么办,删除呗(此时的标签并没有推送到远程库)。

$ git tag -d v0.5
Deleted tag 'v0.5' (was 351f68e)

那么怎么删除已经推送到远程库的标签呢?首先删除本地的,然后删除远方的。如下:

$ git tag -d v0.8
Deleted tag 'v0.8' (was bbd89ec)
$ git push origin :refs/tags/v0.8

到此,这些命令差不多就够用了,想要成为专家级别的朋友就需要自己去学习更牛的命令,毕竟我还是个小白菜。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值