Git的使用

来源:互联网 发布:nginx session共享 编辑:程序博客网 时间:2024/06/02 01:07

本文是《Git教程》的学习笔记


准备工作:安装Git。

一、新建一个项目存储到仓库

1.1 创建文件夹 –>mkdir 文件夹名

$ mkdir git_demo

1.2 进入到指定的文件夹下–>cd 文件夹名

$ cd git_demo

1.3 显示当前所在的绝对路径

$ pwd

/c/Users/Administrator/Desktop/git_demo

1.4 初始化仓库–>git init

$ git init

Initialized empty Git repository in C:/Users/Administrator/git_demo/.git/

1.5 下有一个.git的隐藏文件夹,如果想看到,可以使用ls -ah命令

$ ls -ah

./ ../ .git/

1.6 提交文件共2步:

  • 1.6.1 将要提交的文件选中,准备提交 –>git add 文件名.后缀
    $ git add readme.txt //执行这个命令,如没有任何显示,则说明添加成功;

  • 1.6.2 提交选中的文件 –>git commit -m “对提交代码的描述性文字”
    $ git commit -m "添加一个readme文件"

    [master (root-commit) 1b60c44] 添加一个readme文件
    1 file changed, 2 insertions(+) –> //有一个文件改变,插入了两行内容;
    create mode 100644 readme.txt

1.7 是否可以一次性add多个文件? –>可以

$ git add file1.txt –> //可以分两次add;
$ git add file2.txt file3.txt –> //可以一次add多个文件,中间用空格分开;
$ git commit -m "add 3 files" –> //一次性添加3个文件

二、仓库状态查看

readme.txt文件的原内容 :

aaaaa
bbbbbbbbb

现将内容更改为 :

cc
bbbbbbbbb

2.1 查看当前仓库中文件是否有更改

$ git status

On branch master
Changes not staged for commit:
(use “git add …” to update what will be committed)  –>可以使用git add 文件名.后缀
(use “git checkout – …” to discard changes in working directory)  –>可以使用git checkout 文件名.后缀
modified: readme.txt –>存在修改的文件
no changes added to commit (use “git add” and/or “git commit -a”)

2.2 查看指定文件的内容与上个版本的区别

$ git diff

diff –git a/readme.txt b/readme.txt
index 937176d..c92da49 100644
— a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-aaaaa - - -> 删除(-)
+cc - - ->新增(+)
bbbbbbbbb
\ No newline at end of file

2.3 可以查看指定文件的内容? –>可以

$ cat readme.txt

cc
bbbbbbbbb //readme.txt文件中的内容;

2.4 diffcat 的区别?

  • diff : 显示同个文件前后两次的差异;
  • cat : 显示修改后的文件的全部内容 ;

2.5 回退指定的文件至最近一次修改的版本

  • 2.4.1 执行cat readme.txt

    cc
    bbbbbbbbb

  • 2.4.2 git checkout -- readme.txt

    aaaaa
    bbbbbbbbb

2.6 提交流程

  • 2.6.1 执行git status,查看是否有修改的文件 ;
  • 2.6.2 若有修改,则执行git diff 文件名.后缀 ,查看修改的地方是否正确;
  • 2.6.3 若修改的地方都是要提交的,则执行git add 文件名.后缀
  • 2.6.4 执行git status,查看返回的数据是否为如下所示 :

    $ git status
    On branch master
    Changes to be committed:
    (use “git reset HEAD …” to unstage)
    modified: readme.txt

  • 2.6.5 执行$ git commit -m "修改第一行数据为cc"

    [master 5f1b84c] 修改第一行数据为cc
    1 file changed, 1 insertion(+), 1 deletion(-)  –>有一个文件发生改变,插入一样,删除一行

  • 2.6.6 提交完毕后,执行git status

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

  • 2.6.7 在2.6.4之后,如果之前add的文件不想提交,可根据2.6.4中的提示取消之前添加的文件;
    $ git reset HEAD readme.txt(把暂存区的修改撤销掉(unstage),重新放回工作区;)

    Unstaged changes after reset:
    M readme.txt

  • 2.6.8 在2.6.7之后执行git status,返回如下结果则说明之前add的文件已经取消;

    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”)

三、版本回退

一般版本回退需要知道之前的版本号,可以通过git log 查看

3.1 提交的日志查看

$ git log

commit 5f1b84cb3f218473014cf17361d36e449256dded  –>(第二次提交的)
Author: Elson aaa@163.com
Date: Sat Jul 30 00:37:25 2016 +0800
修改第一行数据为cc

commit 1b60c443b4763eef7ed2e51157d75954051a6883  –>(第一次提交的)
Author: Elson aaa@163.com
Date: Fri Jul 29 23:40:40 2016 +0800
添加一个readme文件

$ git log -num 数字num表示最近num次提交的log,此处num=1

commit 5f1b84cb3f218473014cf17361d36e449256dded  –>(第二次提交的)
Author: Elson aaa@163.com
Date: Sat Jul 30 00:37:25 2016 +0800
修改第一行数据为cc

3.2 如何简化显示的内容?

$ git log --pretty=oneline 单行显示

5f1b84cb3f218473014cf17361d36e449256dded 修改第一行数据为cc
1b60c443b4763eef7ed2e51157d75954051a6883 添加一个readme文件

注: 5f1b8…6dded 这一串字符是commit id(版本号),是一个SHA1计算出来的一个非常大的数字,用十六进制表示,相当与SVN上面的version1,2,3;

3.3 为什么不使用1,2,3作版本号?

因为Git是分布式的版本控制系统,若多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,则会引起版本号冲突。

3.4 回退版本

$ git reset --hard HEAD^

HEAD is now at 1b60c44 添加一个readme文件 —>指针现在指向版本号为1b60c44的版本(参照3.1);

此时执行 $ git log 命令,只看到当前指针以前的log日志;

commit 1b60c443b4763eef7ed2e51157d75954051a6883
Author: Elson aaa@163.com
Date: Fri Jul 29 23:40:40 2016 +0800
添加一个readme文件

类型 表示的意思 HEAD 表示当前版本,也就是最新提交的版本; HEAD^ 表示上一个版本; HEAD^^ 表示上上一个版本; HEAD~20 表示往上20个版本;

注:
- HEAD指哪,当前commit就是哪;
- –hard就是用版本库的内容覆盖本地;

3.5 如何撤销之前的回退操作呢?(git reset –hard 需要还原的版本号)

$ git reset --hard 5f1b84c

HEAD is now at 5f1b84c 修改第一行数据为cc

此时执行 $ git log 命令,结果与3.1相同,说明撤销回退的操作成功;

commit 5f1b84cb3f218473014cf17361d36e449256dded
Author: Elson aaa@163.com
Date: Sat Jul 30 00:37:25 2016 +0800
修改第一行数据为cc

commit 1b60c443b4763eef7ed2e51157d75954051a6883
Author: Elson aaa@163.com
Date: Fri Jul 29 23:40:40 2016 +0800
添加一个readme文件

3.6 如何获取3.5中需要的版本号呢?

  • 3.6.1 如果窗口未关闭,则可以在窗口内查找到回退之前的版本,即3.1的内容;
  • 3.6.2 如果窗口关闭,可以通过git reflog 查找之前所有的操作;
    $ git reflog

    5f1b84c HEAD@{0}: reset: moving to 5f1b84c
    1b60c44 HEAD@{1}: reset: moving to HEAD^
    5f1b84c HEAD@{2}: commit: 修改第一行数据为cc
    1b60c44 HEAD@{3}: commit (initial): 添加一个readme文件

    版本号 指针位置 操作类型 执行的操作 5f1b84c HEAD@{2} commit 修改第一行数据为cc

    根据返回的数据,可以找到我们所需的版本号;

    文本内容 意义 5f1b84c HEAD@{0}: reset: moving to 5f1b84c moving to 5f1b84c: 指针移动到指定的版本(5f1b84c) 1b60c44 HEAD@{1}: reset: moving to HEAD^ moving to HEAD^: 指针移动到上一个版本 5f1b84c HEAD@{2}: commit: 修改第一行数据为cc commit: 修改第一行数据为cc: 提交代码 1b60c44 HEAD@{3}: commit (initial): 添加一个readme文件 commit(initial): 第一次提交

四、工作区和暂存区

这里写图片描述
具体请参照《工作区和暂存区》

五、管理修改

5.1 查看工作区和版本库里面最新版本的区别

git diff HEAD -- readme.txt

diff –git a/readme.txt b/readme.txt
index c92da49..a721081 100644
— a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,4 @@
cc
-bbbbbbbbb
\ No newline at end of file
+bbbbbbbbb
+
+ffff

六、撤销修改

6.1 丢弃工作区域的修改

git checkout -- file

意义:把readme.txt文件在工作区的修改全部撤销,有两种情况:

  • 6.1.1 readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
  • 6.1.2 readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commit或git add时的状态。

操作指令 含义 git checkout name 切换到另一个分支 git checkout – file 撤销工作区指定文件的修改

6.2 把暂存区的修改撤销掉(unstage),重新放回工作区

git reset HEAD file

6.3 场景模拟

  • 6.3.1 工作区文件有修改,还没提到暂存区时,可以用命令git checkout -- file直接丢弃工作区的修改。
  • 6.3.2 工作区文件有修改,且提到暂存区时,若想丢弃修改,分两步
    • 第一步:git reset HEAD file,回到了场景1;
    • 第二步:git checkout -- file,按场景1操作;
  • 6.3.3 文件已经提交到本地仓库(未提交到远程仓库),若想撤销本次提交,git reset --hard HEAD^

七、删除文件

7.1 直接在文件管理器中把没用的文件删了,或者用rm命令删除

$ rm readme.txt

  • 如果被删除的文件之前提交到本地版本库中,则删除后可通过git checkout -- readme.txt 从仓库中还原回来(注意:–后面要空格);
  • 如果被删除的文件之前没有提交到本地版本库中,则删除后可进入文件夹内按Ctrl+Z还原;

7.2 删除版本库中的文件(流程和添加文件相似)

$ git rm test.txt

rm ‘readme.txt’

$ git commit -m "删除文件"

[master 0f4131f] 删除文件
1 file changed, 3 deletions(-)
delete mode 100644 readme.txt

注:命令git rm用于删除一个文件。
如果一个文件已经被提交到版本库,那么永远不用担心误删;
但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容

八、远程仓库

8.1 生成公私钥

$ ssh-keygen -t rsa -C "aaa@163.com"把邮件地址换成自己的邮件,然后一路回车,使用默认值即可;

Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/Administrator/.ssh/id_rsa):  –>加粗的为路径
Created directory ‘/c/Users/Administrator/.ssh’.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/Administrator/.ssh/id_rsa.  –>私钥
Your public key has been saved in /c/Users/Administrator/.ssh/id_rsa.pub.  –>公钥
The key fingerprint is:
SHA256: …略… aaa@163.com
The key’s randomart image is: 略

8.2 如何将SSH添加到Github上?

这里写图片描述

8.3 如何关联本地仓库和远程仓库?

$ git remote add origin git@github.com:github的账户名/github的仓库名.git
远程库的名字就是origin,这是Git默认的叫法,也可以改成别的;

8.4 如何将本地仓库的文件推送到远程仓库中?

  • 8.4.1 如果远程库是空的,那么在第一次推送master分支时,加上-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
    $ git push -u origin master

  • 8.4.2 如果远程库不为空

  • $ git push origin master

8.5 如何将远程仓库中的文件clone到本地

Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。

  • SSH协议:$ git clone git@github.com:github的账户名/github的仓库名.git
  • Https协议:$ git clone https://github.com/github的账户名/github的仓库名.git

九、创建与合并分支

9.1 常用的命令

描述 命令 查看分支 git branch 创建分支 git branch branchName 切换分支 git checkout branchName 创建+切换分支 git checkout -b branchName 合并某分支到当前分支 git merge branchName 删除分支 git branch -d branchName

9.2 场景模拟

  • 创建分支和切换分支可以合并为一个git branch -b branchName命令实现;
  • 合并分支时,假设有A,B,C三个分支,要将A分支合并到C分支上,则应先执行git checkout C 将分支切换到C上,然后执行git merge A 命令,将A分支合并到C分支上;此时如果想删除分支A,可以执行git branch -d A 命令;

十、解决分支合并引起的冲突

这里写图片描述

10.1 常用的命令

用带参数的git log也可以看到分支的合并情况

$ git log --graph --pretty=oneline --abbrev-commit

命令 含义 –graph 可以看到分支合并图 –pretty=oneline 单行显示 –abbrev-commit 版本号显示前几位+提交到文本描述

Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容

十一、 分支管理策略

11.1 Fast forward模式和非Fast forward模式的区别?

  • Fast forward模式:这种模式下,删除分支后,会丢掉分支信息。
  • 非Fast forward模式:这种模式下,Git在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

11.2 如何禁止Fast forward模式呢?--no-ff (ff是Fast forward的简写)

$ git merge --no-ff -m "merge with no-ff" dev
本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。

11.3 两种模式下合并代码后的效果图?

Fast forward模式,merge后就像这样:
这里写图片描述

非Fast forward模式,merge后就像这样:
这里写图片描述

11.4 删除未合并的分支

git branch -D new_dev

十二、Bug分支

在Git中,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。

场景:当接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,当前你正在dev上进行的工作还没有提交,且不能提交;但是,必须在两个小时内修复该bug,怎么办?

幸好,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:

12.1 存储当钱的工作空间

$ git stash

Saved working directory and index state WIP on A: 6e86183 add DD(提交时的注释)
HEAD is now at 6e86183 add DD(提交时的注释)

$ git status

On branch A
nothing to commit, working directory clean

12.2 如果不执行git stash ,直接切换回master分支,会怎么样呢?

$ git checkout master

error: Your local changes to the following files would be overwritten by checkou t:
readme.txt
Please, commit your changes or stash them before you can switch branches.
Aborting  (在切换分支之前,请先提交,或暂存之前的修改。)

12.3 如何查看之前的存储记录呢?

$ git stash list

stash@{0}: WIP on A: 6e86183 add DD

12.4 如何还原之前的操作记录?

  • 12.4.1 $ git stash pop

    On branch A
    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} (ea857e678ae9b8b65560249a840f1fde6c8fb0b8)   –>和下面对比多了此行

  • 12.4.2 $ git stash apply 不会删除之前stash的记录

    On branch A
    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”)

  • 12.4.3 $ git stash drop

    Dropped refs/stash@{0} (a552f7c432166140cd44a9a521d13c71cba9c7a2)

注: 12.4.1的操作相当于12.4.2 + 12.4.3

12.5 场景模拟

12.5.1 $ git stash pop模拟

  • 先存储
    $ git stash

    Saved working directory and index state WIP on A: 6e86183 add DD
    HEAD is now at 6e86183 add DD

  • 查看有几个stash
    $ git stash list

    stash@{0}: WIP on A: 6e86183 add DD

  • 还原
    $ git stash pop

    On branch A
    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} (ea857e678ae9b8b65560249a840f1fde6c8fb0b8)

  • 查看有几个stash
    $ git stash list

    …空的…

  • 第二次还原
    $ git stash pop

    No stash found.

12.5.2 $ git stash apply模拟

  • 先存储
    $ git stash

    Saved working directory and index state WIP on A: 6e86183 add DD
    HEAD is now at 6e86183 add DD

  • 查看有几个stash
    $ git stash list

    stash@{0}: WIP on A: 6e86183 add DD

  • 还原
    $ git stash apply

    On branch A
    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”)

  • 查看有几个stash
    $ git stash list

    stash@{0}: WIP on A: 6e86183 A:add DD

  • 第二次还原
    $ git stash apply 会报错
    error: Your local changes to the following files would be overwritten by merge:
    readme.txt
    Please, commit your changes or stash them before you can merge.
    Aborting

  • 删除stash的记录
    $ git stash drop 删除stash的记录

    Dropped refs/stash@{0} (a552f7c432166140cd44a9a521d13c71cba9c7a2)

  • 查看有几个stash
    $ git stash list

    …空的…

十三、多人协作(远程仓库)

13.1

13.2

13.3

十四、创建标签

14.1 新建一个标签

git tag <name> (commit id) 括号内可以省略,则默认为HEAD;

14.2 指定标签信息

git tag -a <tagname> -m "文本描述"

14.3 用PGP签名标签

git tag -s <tagname> -m "文本描述"

14.4 查看所有标签

git tag

十五、操作标签

15.1 推送一个本地标签

git push origin <tagname>

15.2 推送全部未推送过的本地标签

git push origin --tags

15.3 删除一个本地标签

git tag -d <tagname>

15.4 删除一个远程标签

git push origin :refs/tags/<tagname>

十六、忽略特殊文件

十七、配置别名


其他

输出内容配色

$ git config --global color.ui true


问题锦集


  1. 出现的问题

$ git commit -m “ccc”
fatal: Unable to create ‘C:/Users/Administrator/Desktop/demo/.git/index.lock’: File exists.
Another git process seems to be running in this repository, e.g. an editor opened by ‘git commit’. Please make sure all processes are terminated then try again. If it still fails, a git process may have crashed in this repository earlier: remove the file manually to continue.

解决方案:$ rm -f ./.git/index.lock 或者进入对应.git目录删除index.lock文件



参考:
《Git和GitHub使用总结》
《Git权威指南》
《Git教程》

0 0
原创粉丝点击