何为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