Git使用总结(廖雪峰)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值