Git 教程
文章目录
一.初始化版本库
1.git init
初始化仓库
2.添加文件到learngit目录下面
使用git add readme.txt
命令告诉git添加了文件
git commit -m "输入的备注"
1 file changed, 2 insertions(+)
一个文件被修改,插入了两行内容
commit
可以一次性提交很多内容,所以可以add
很多次之后再commit
二.时光机穿梭
修改readme文件,使用git status查看文件状态
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
看到readme已经被修改了,但是还没有提交
使用git diff
查看修改了什么内容
查看difference的意思
diff查看工作区和暂存区差异
当你commit之后就不会有内容了,因为stage中没有内容了
查看之后就可以将readme再次提交
git add readme.txt
结果显示将要被提交的文件包括readme.txt
之后就可以提交了
git commit
1.版本回退
在git中使用git log
可以查看历史的记录
可以查看到版本更改的时间,更改的用户信息
$ git log
commit ebc829312af99f3efdf5f8026f5cd0929e865bf8 (HEAD -> master)
Author: zhengxiaorui <zhengxiaorui1998@gmail.com>
Date: Thu Feb 13 16:44:47 2020 +0800
这是第三次测试
commit 5e116327ced2545d3eb08997e1c2261ffd870b59
Author: zhengxiaorui <zhengxiaorui1998@gmail.com>
Date: Thu Feb 13 16:42:56 2020 +0800
这是第二次修改
commit d7b456fd8a20327b8d36c8de8289038d25ea77a2
Author: zhengxiaorui <zhengxiaorui1998@gmail.com>
Date: Thu Feb 13 16:11:37 2020 +0800
wrote a readme file
可以加上--pretty=oneline
指令查看简短的更改
$ git log --pretty=oneline
ebc829312af99f3efdf5f8026f5cd0929e865bf8 (HEAD -> master) 这是第三次测试
5e116327ced2545d3eb08997e1c2261ffd870b59 这是第二次修改
d7b456fd8a20327b8d36c8de8289038d25ea77a2 wrote a readme file
head表示的是当前的版本,head^表示前一个版本,以此类推
回退到上一个版本
使用指令git reset
$ git reset --hard head^
HEAD is now at 5e11632 这是第二次修改
使用cat
指令可以查看文件的内容
cat readme.txt
回到了第二次改变的时候的内容
这只是git内部有一个head指针把原来指向第三个文件的指针指向了第二个,将指针指向第三个就可以回到第三个
git reset --hard ebc8
$ git reset --hard ebc8
HEAD is now at ebc8293 这是第三次测试
可以看到,文件又回到了第三次的时候
使用git log
查看状态
$ git log
commit ebc829312af99f3efdf5f8026f5cd0929e865bf8 (HEAD -> master)
Author: zhengxiaorui <zhengxiaorui1998@gmail.com>
Date: Thu Feb 13 16:44:47 2020 +0800
这是第三次测试
commit 5e116327ced2545d3eb08997e1c2261ffd870b59
Author: zhengxiaorui <zhengxiaorui1998@gmail.com>
Date: Thu Feb 13 16:42:56 2020 +0800
这是第二次修改
commit d7b456fd8a20327b8d36c8de8289038d25ea77a2
Author: zhengxiaorui <zhengxiaorui1998@gmail.com>
Date: Thu Feb 13 16:11:37 2020 +0800
和原来一样
这里很重要的就是要找到每次commit
的时候的id,前面指令的ebc8就是第三次修改的时候的id
git中使用git reflog
可以查看每次修改的id
$ git reflog
ebc8293 (HEAD -> master) HEAD@{0}: reset: moving to ebc8
5e11632 HEAD@{1}: reset: moving to head^
ebc8293 (HEAD -> master) HEAD@{2}: commit: 这是第三次测试
5e11632 HEAD@{3}: commit: 这是第二次修改
d7b456f HEAD@{4}: commit (initial): wrote a readme file
2.工作区和暂存区
在learngit文件夹中新增加一个文件和修改readme中的内容,查看status:
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: readme.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
LICENSE.txt
no changes added to commit (use "git add" and/or "git commit -a")
一个文件被modified,一个文件是untracked的
git add
这两个文件,他们这时候就是到暂存区中,也就是stage中
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: LICENSE.txt
modified: readme.txt
之后,执行commit
就可以将文件存放到分支,也就是master中了
$ git commit -m "添加两个文件"
[master 7f9561a] 添加两个文件
2 files changed, 3 insertions(+), 1 deletion(-)
create mode 100644 LICENSE.txt
git commit
只会commit暂存区的内容,而不会将工作区的内容commit到分支
当你更改了两次同一个文件,但是只把一次修改add,最后commit的时候之后commit那个add到stage中的文件,所以在工作区中的文件和在分支中的文件是不同的,可以使用git diff head --readme.txt
查看工作区的文件和分支中的文件的区别
$ git diff HEAD -- readme.txt
diff --git a/readme.txt b/readme.txt
index db28b2c..9a8b341 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,4 +1,4 @@
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
-Git tracks changes.
\ No newline at end of file
+Git tracks changes of files.
\ No newline at end of file
3.撤销修改
当你修改工作区的文件的时候,还没add和commit,你发现了问题,当你要撤销这个修改的时候;
git 提示 (use "git restore <file>..." to discard changes in working directory)
使用git restore
可以恢复文件
使用git restore readme.txt
文件恢复
具体git有提示
4.删除文件
当你添加一个文件之后再工作区删除了这个文件之后,那么工作区和版本库中的文件就不一样了
使用git status
会查看到记录中删除的记录
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
deleted: test.txt
no changes added to commit (use "git add" and/or "git commit -a")
这是你要做的: 1.版本库中删除文件,之后commit
2.删错了,restore
- 1.
git rm readme.txt
git commit -m "确认删除"
- 2.
git restore readme.txt
二.远程仓库
1.添加远程仓库
将当前仓库和远程仓库关联起来的代码
git remote add origin git@github.com:zhengxiaorui1998/learngit.git
将当前仓库中的文件上传到远程仓库上
git push -u origin master
origin只是一个名字而已
第一次需要加上-u
参数 ,
之后就仅仅需要:
git push origin master
就可以
2.从远程库克隆
git clone git@github.com:zhengxiaorui1998/gitskills.git
三.分支管理
1.创建与合并分支
创建dev
分支
git checkout -b dev
出来语句:
创建的是一个新的分支
$ git checkout -b dev
Switched to a new branch 'dev'
上面指令是创建并切换的意思
git branch dev
git checkout dev
两条指令合一
使用git branch
可以列出所有分支*
会标出当前指向的分支
创建分支—>添加文件---->add,commit
将当前分支切换回master会发现在dev修改的内容没有出现在master中的文件里
git checkout master
原因是更改的文件在dev分支中,master分支无法读取
所以需要合并才可以读取
在master执行git merge dev
合并dev分支
合并之后,就可以删除dev分支了
git branch -d dev
使用switch替代checkout
3.解决冲突
当两个分支都有各自新的提交的时候Git无法进行快速合并
使用git status
可以查看当前状况
$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Changes to be committed:
new file: readme.txt
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: README.md
使用cat README.md
查看文件状况
$ cat README.md
# gitskills
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick.
Creating a new branch is quick AND simple.
>>>>>>> feature1
HEAD就是当前指向的master的文件内的内容
下面是另外一个分支的内容
使用git log --graph --pretty=oneline --abbrev-commit
可以查看全部分支结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LxLuzfxT-1583304894297)(2020-02-14-13-59-29.png)]
3.分支管理策略
前面默认使用的fast forward合并在删除掉分支之后,会丢掉分支的信息
比如dev
分支增加了新的内容,切换回到master
之后merge
,之后再删除掉dev
分支,那么会丢失掉dev
分支的新增内容
如果使用fast-forward是不会有分支合并的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ex89hmBD-1583304894298)(2020-02-14-14-36-18.png)]
而不使用ff的方法的话应该是这种情况:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3PD9VH3e-1583304894299)(2020-02-14-15-25-25.png)]
merge
之后dev和master指针指向不同
* e1e9c68 (HEAD -> master) merge with no-ff
|\
| * f52c633 (dev) add merge
|/
* cf810e4 conflict fixed
...
分支策略:
master是非常稳定的,所以他应该使用来进行发布性版本,平时不在上面干活
合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
也就是说,使用no-ff
的方法的时候,dev还在dev,并没有和master在一起,所以这时候删除dev
分支的话不会把更新的数据删除掉
no-ff和ff的区别就是ff如果删除的话就会一起删除
4.Bug分支
适用于:
当前工作需要暂停,去暂时处理其他问题,之后要重新处理当前这个问题
git提供的是stash
的功能
可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
$ git stash
Saved working directory and index state WIP on dev: b153dac test
b153dac的是id号
没有需要保存的话就是:
$ git stash
No local changes to save
之后就要确定在哪里修复bug,要在master修复就得在master建立分支
git stash list
查看保存现场
恢复数据有两个方法:
一是用git stash apply
恢复,但是恢复后,stash内容并不删除,你需要用git stash drop
来删除;
另一种方式是用git stash pop
,恢复的同时把stash内容也删了:
4.feature分支
一个分支还没有merge
就要删除
使用大写的-D
强制删除
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F5GhrLcy-1583304894300)(2020-02-14-17-23-08.png)]
强制删除:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TqPkOFkg-1583304894302)(2020-02-14-17-23-38.png)]
5.多人协作
当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。
两条指令:
git remote
:远程库的信息
git remote
:更详细的信息
推送分支:
git push origin master
默认克隆只能克隆master分支
要克隆dev,首先在推送端得把dev也给push上去
git push --set-upstream origin dev
在接受端就可以使用
git switch -c dev origin/dev
将dev弄下来
在接收端重新更改文件,之后就可以push
,要加上push的分支
$ git push origin dev
在你更新的时候,其他人也对这个内容进行了更新,那么这时候就不一致了,你需要将其他人更新的内容pull
下来之后再 push
,这样才能做到一致
6.Rebase
分支出现冲突,先push出现冲突,pull,合并,之后才能push
使用rebase可以将分支合成一条主线
四.标签管理
版本号的作用tag
请把上周一的那个版本打包发布,commit号是6a5819e…”
“一串乱七八糟的数字不好找!”
如果换一个办法:
“请把上周一的那个版本打包发布,版本号是v1.2”
1.创建标签
$ git tag v1.0
使用git tag
可以查看所有的标签
标签默认是标志到当前commit上的
可以通过log
查看id之后就可以给历史的记录加上便签
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CARbUEa6-1583304894303)(2020-02-15-00-02-11.png)]
git tag v0.9 id
就可以标签历史的记录了
可以通过
git show v1.0
来查看版本信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nJi2UDhu-1583304894304)(2020-02-15-00-05-07.png)]
2.操作标签
删除标签
git tag -d v1.0
推送标签
git push origin v1.0
推送所有标签
$ git push origin --tags
如果标签在远程有,那么现在本地删除
git tag -d v
接着
git push origin :refs/tags/v0.9