GIT学习笔记

何为git

一种分布式代码版本管理系统

安装git

安装完成后进入bash,使用如下命令创建本地用户名和密码

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

配置完成后,这台机器上所有的Git仓库都会使用这个配置

创建版本库

  • 在需要创建版本库的文件夹中单击右键选择‘Git Bash Here’,将这个文件夹设置为一个本地版本库工作区,此时该文件夹下将生成.git的隐藏文件

  • 将文件添加到版本库
    git跟踪的是某个文件的修改痕迹,首先通过add命令将所需要提交的文件的当前状态提交到git暂存区(stage),然后再用commit命令将暂存区的文件统一提交到版本库(也就是分支,主分支master或者是其他分支):

$ git add file1.txt //添加一个文件
$ git add file2.txt file3.txt   //添加两个文件
$ git commit -m "add 3 files."  //将添加的文件统一提交,并附上提交备注

版本控制

git版本控制功能包括当前状态展示、查看修改情况、版本回退、修改撤销和恢复误删等功能

1.当前状态

使用'git status'命令查看当前git状态(git reflog命令用于查看每次版本修改情况,更简洁)

  • 工作区和暂存区没有任何变化时:
$ git status
On branch master
nothing to commit, working tree clean

  • 工作区有文件被修改但未添加到暂存区
$ git status
On branch master
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   readme.txt

no changes added to commit (use "git add" and/or "git commit -a")

表示在master分支上的readme.txt被修改但未添加到暂存区

  • 文件添加到缓存区但未提交
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD ..." to unstage)

        modified:   license.txt

表示在master分支上的license.txt被修改但未添加到暂存区

2.查看修改情况

如果status中提示有文件被修改,使用'git diff'查看修改情况

$ git diff
diff --git a/readme.txt b/readme.txt
index a3c5d47..7a34c38 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,3 +1,4 @@
 Git is a version control system
 Git is a free software
-Git is very easy to learn
\ No newline at end of file
+Git is very easy to learn
+i am learning git now
\ No newline at end of file

表示readme这个文件被修改了,添加了部分内容,删除了部分内容;在提交完成后,修改情况将被清空

3.版本回退

使用"git log"命令查看该分支的历史版本情况

$ git log
commit 4d90671a4279830f17caf97588647e76631b9bbb (HEAD -> master)
Author: Tianyuan_hyomin <[email protected]>
Date:   Wed Apr 4 12:36:58 2018 +0800

    a new modification

commit fcb26d949cf96bc0fdf023ad1152e76c7b812e8b
Author: Tianyuan_hyomin <[email protected]>
Date:   Wed Apr 4 10:13:29 2018 +0800

    modified two files:readme and license

commit c2f0fadca6ea267b05b5043553ba5a78c4c9454e
Author: Tianyuan_hyomin <[email protected]>
Date:   Wed Apr 4 10:02:22 2018 +0800

    create license file

每次提交都会生成一个新的commit id版本号,用来对修改进行唯一标识,其中HEAD表示在当前分支中使用的当前版本节点,Git允许我们在版本的历史之间穿梭,可以使用以下命令在不同版本间进行跳跃

  • 回退到某个版本
$ git reset --hard 4d90671
HEAD is now at 4d90671 a new modification

当前指针HEAD即被指向了4d90671这个版本,使用git reflog查看历史版本:

$ git reflog
4d90671 (HEAD -> master) HEAD@{0}: reset: moving to 4d90671
a888196 HEAD@{1}: commit: git reset HEAD readme.txt
4d90671 (HEAD -> master) HEAD@{2}: commit: a new modification
fcb26d9 HEAD@{3}: commit: modified two files:readme and license
c2f0fad HEAD@{4}: commit: create license file
67eccd7 HEAD@{5}: reset: moving to 67eccd
2e7dba5 HEAD@{6}: reset: moving to HEAD^
67eccd7 HEAD@{7}: commit: modified the readme file
2e7dba5 HEAD@{8}: commit (initial): wrote a readme file

4.撤销修改

  • 某文件被修改,暂未添加到暂存区,使用“git checkout -- ”命令来撤销修改
Administrator@USER-20170210DS MINGW64 /f/学习/刘耕的编程文件夹/git_repository (master)
$ git status
On branch master
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   readme.txt

no changes added to commit (use "git add" and/or "git commit -a")
Administrator@USER-20170210DS MINGW64 /f/学习/刘耕的编程文件夹/git_repository (master)
$ git checkout -- readme.txt
Administrator@USER-20170210DS MINGW64 /f/学习/刘耕的编程文件夹/git_repository (master)
$ git status
On branch master
nothing to commit, working tree clean

  • 某文件被修改且被添加到了暂存区,使用“git reset HEAD file”撤销添加暂存区,然后再用上述的checkout方式撤销文件的修改
    (代码略)

5.恢复误删

  • 在工作区中误删了某个文件时,提示如下:
Administrator@USER-20170210DS MINGW64 /f/学习/刘耕的编程文件夹/git_repository (master)
$ git status
On branch master
Changes not staged for commit:
  (use "git add/rm ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        deleted:    license.txt

no changes added to commit (use "git add" and/or "git commit -a")

使用“$ git checkout -- filename”命令恢复误删

Administrator@USER-20170210DS MINGW64 /f/学习/刘耕的编程文件夹/git_repository (master)
$ git checkout -- license.txt

可以看到license.txt文件被恢复了,其实就是用版本分支中的文件覆盖了工作区中的文件

  • 在本地版本库分支中误删了某个文件
    使用git reset回退到上个版本即可

  • 附:删除版本库中某个文件

Administrator@USER-20170210DS MINGW64 /f/学习/刘耕的编程文件夹/git_repository (master)
$ git rm license.txt
rm 'license.txt'

Administrator@USER-20170210DS MINGW64 /f/学习/刘耕的编程文件夹/git_repository (master)
$ git commit -m "remove license"
[master 09577b1] remove license
 1 file changed, 1 deletion(-)
 delete mode 100644 license.txt

工作区中该文件也跟着被删了

分支管理

创建一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作

1.创建与合并分支

才新建版本库时只有一个主分支,即master每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。

新建一个分支dev,并将HEAD指针指向dev,表示在dev这个分支上进行工作,从现在开始,对工作区的修改和提交就是针对dev分支了,新提交一次后,dev指针往前移动一步,而master指针不变

  • 创建dev分支
Administrator@USER-20170210DS MINGW64 /f/学习/刘耕的编程文件夹/git_repository (master)
$ git checkout -b dev
Switched to a new branch 'dev'

Administrator@USER-20170210DS MINGW64 /f/学习/刘耕的编程文件夹/git_repository (dev)
$ git status
On branch dev
nothing to commit, working tree clean

将HEAD指针指向了最新创建的dev分支,而原来的master分支则保持原状

  • 用git branch命令查看当前分支:
Administrator@USER-20170210DS MINGW64 /f/学习/刘耕的编程文件夹/git_repository (dev)
$ git branch
* dev
  master

可以在这个分支上随意做修改和提交,不影响主分支master

  • 把dev分支的工作成果合并到master分支上
    首先切换回master分支
Administrator@USER-20170210DS MINGW64 /f/学习/刘耕的编程文件夹/git_repository (dev)
$ git checkout master
Switched to branch 'master'

然后将dev合并到master上

Administrator@USER-20170210DS MINGW64 /f/学习/刘耕的编程文件夹/git_repository (master)
$ git merge dev
Updating 4d90671..a3d8b92
Fast-forward
 license.txt | 4 +++-
 readme.txt  | 6 ++++--
 2 files changed, 7 insertions(+), 3 deletions(-)

合并后,再查看文档的内容,就可以看到,和dev分支的最新提交是完全一样的

  • 删除dev分支
Administrator@USER-20170210DS MINGW64 /f/学习/刘耕的编程文件夹/git_repository (master)
$ git branch -d dev
Deleted branch dev (was a3d8b92).

Administrator@USER-20170210DS MINGW64 /f/学习/刘耕的编程文件夹/git_repository (master)
$ git branch
* master

可以看到,删除之后就只剩下master分支了

2.解决冲突

创建一个新分支feature1,然后在新分支上修改license文件并提交

切换回master分支,然后同样做以上操作

尝试合并两个分支,发生冲突:

Administrator@USER-20170210DS MINGW64 /f/学习/刘耕的编程文件夹/git_repository (master)
$ git merge feature1
Auto-merging license.txt
CONFLICT (content): Merge conflict in license.txt
Automatic merge failed; fix conflicts and then commit the result.

需要手动解决冲突才能进行合并,查看status如下:

Administrator@USER-20170210DS MINGW64 /f/学习/刘耕的编程文件夹/git_repository (master|MERGING)
$ git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add ..." to mark resolution)

        both modified:   license.txt

no changes added to commit (use "git add" and/or "git commit -a")

git在发生冲突的license文件中标记出了具体发生冲突的位置:

<<<<<<< HEAD
a another new branch
=======
another new branch
>>>>>>> feature1

将冲突位置该为与另一个分支一致,再进行修改提交,即可成功合并

Administrator@USER-20170210DS MINGW64 /f/学习/刘耕的编程文件夹/git_repository (master|MERGING)
$ git commit -m "commit again"
[master 7a5b769] commit again

用git log --graph命令可以看到分支合并图

3.分支管理策略

一般的分支合并策略都是使用的快速模式(Fast-forward),相当于直接把master指向dev的当前提交,所以合并速度非常快,但这种模式下,删除分支后,会丢掉分支信息

用--no-ff命令切换回普通合并模式:

Administrator@USER-20170210DS MINGW64 /f/学习/刘耕的编程文件夹/git_repository (master)
$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.
 readme.txt | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

使用no-ff模式,相当于在master上重新进行一次修改和提交

4.stash

使用stash命令能够对未提交的修改进行临时保存,待处理完其他问题后再将修改状态恢复

Administrator@USER-20170210DS MINGW64 /f/学习/刘耕的编程文件夹/git_repository (dev)
$ git stash
Saved working directory and index state WIP on dev: c5f42ac hahaha

这时候可以去做其他的处理,例如修改其他模块的bug

entity处理完后再切换回之前的状态:

Administrator@USER-20170210DS MINGW64 /f/学习/刘耕的编程文件夹/git_repository (master)
$ git stash pop
On branch master
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   readme.txt

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (cfd5bb88d79f2c905fb431c5e378579de0c5febb)

5.强行删除分支

某分支如果在未进行合并时进行删除,git会提示,如果删除,将丢失掉修改,如果要强行删除,需要使用命令git branch -D filename

6.远程分支推送

master可直接推送到远程分支上

  • 用git remote或者git remote -v命令查看对应的远程分支
$ git remote
  • 将master分支推送到远程分支
$ git push origin master
  • 推送其他分支:方法同上

标签管理

用标签来给某个版本打上标记,便于未来恢复

1.创建标签

  • 为当前HEAD打上标签
Administrator@USER-20170210DS MINGW64 /f/学习/刘耕的编程文件夹/git_repository (master)
$ git tag v1.0

  • 为历史版本打上标签,得指明版本id
Administrator@USER-20170210DS MINGW64 /f/学习/刘耕的编程文件夹/git_repository (master)
$ git tag v0.9 6224937
  • 创建带有说明的标签
$ git tag -a v0.1 -m "version 0.1 released" 3628164
  • 用git show查看标签具体情况

Administrator@USER-20170210DS MINGW64 /f/学习/刘耕的编程文件夹/git_repository (master)
$ git show v1.0
commit 59b94ffc5097f73a859262a2aa3ea50d4167a2cb (HEAD -> master, tag: v1.0)
Author: Tianyuan_hyomin <[email protected]>
Date:   Wed Apr 4 16:04:54 2018 +0800

    a modify

diff --git a/readme.txt b/readme.txt
index cd693f3..5a82abc 100644
--- a/readme.txt
+++ b/readme.txt
@@ -7,4 +7,8 @@ a new message

 哈哈哈哈

-噢噢噢噢哦哦哦
\ No newline at end of file
+噢噢噢噢哦哦哦
+
+
+
+嘿嘿嘿
\ No newline at end of file

  • 通过-s用私钥签名一个标签,签名采用PGP签名,因此,必须首先安装gpg(GnuPG),如果没有找到gpg,或者没有gpg密钥对,就会报错

2.操作标签

  • 删除标签
Administrator@USER-20170210DS MINGW64 /f/学习/刘耕的编程文件夹/git_repository (master)
$ git tag -d v1.0
Deleted tag 'v1.0' (was 59b94ff)

  • 推送标签到远程库
$ git push origin v1.0

你可能感兴趣的:(GIT学习笔记)