Git使用总结

一、Git基本用法

1. 安装之后的设置

安装Git之后,首先应当设置用户名和电子邮件,因为Git每一次提交都要用到这些信息。如果没有设置,在提交的时候会出现如下信息:

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

按照提示信息,要设置用户名为mcw,电子邮件地址为mcw@example.com,就要输入:

git config --global user.name mcw
git config --global user.email mcw@example.com

2. 在本地初始化一个Git仓库

要用Git对一个项目进行管理,需要进入项目目录并执行如下命令:

$ git init

这会在项目目录下创建.git目录,这个目录包含了Git管理当前项目所必须的文件。

3. 在仓库中添加文件

初始化之后,使用git add命令让Git跟踪项目中的文件。

假设当前的项目目录(也称作“工作目录”)是learngit,目录下有README和LICENSE两个文件,执行git add README让Git跟踪README文件,然后执行git status查看当前的文件状态:

$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   README

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        LICENSE

可以看到README已经被添加到暂存区,等待提交,而LICENSE还未被添加到暂存区。

接下来执行git commit把README提交到Git仓库中。

执行这条命令后就会打开文本编辑器(Linux中默认是vim),并显示以下文本:

  # Please enter the commit message for your changes. Lines starting
  # with '#' will be ignored, and an empty message aborts the commit.
  #
  # On branch master
  #   # Initial commit
  #
  # Changes to be committed:
  #   new file:   README
  #
  # Untracked files:
  #   LICENSE
  #

输入提交信息并退出编辑器,就完成了文件README的提交。

$ git commit
[master (root-commit) 0c79677] add README
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README

4. 从Git仓库移除文件

使用git rm命令可以移除Git仓库中的文件,同时也会把该文件从工作目录移除。现在删除README,然后查看仓库状态:

$ git rm README
rm 'README'
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        deleted:    README

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        LICENSE

要恢复删除的文件,从git status的提示中可以知道,应当执行:

$ git restore --staged README

然后再次执行

$ git restore README

5. 查看提交记录

在提交了若干次之后,可以用git log查看提交历史。默认情况下,git log会按时间先后顺序显示所有的提交记录,最早的提交显示在最下面,最上面的是最新的提交。

$ git log
commit 250641fa0f17c32288c3860bb81ebccb7df6e31e (HEAD -> master)
Author: mcw <mcw@example.com>
Date:   Tue Oct 20 09:30:46 2020 +0800

    add LICENSE

commit 0c79677a8917b3f26e0b06237016132f9d9bce98
Author: mcw <mcw@example.com>
Date:   Mon Oct 19 22:54:08 2020 +0800

    add README

6. 回退

HEAD指针是指向当前分支的指针,它指向该分支上的最后一次提交。

取消暂存区中的文件,即从暂存区删除文件,可以使用如下命令:

$ git reset HEAD <file>
$ git reset HEAD

git reset -—hard HEAD^可以让HEAD回退到上一个版本,其中HEAD^表示当前提交从左到右的第一个父提交,当一个提交有多个父提交时,可以通过在^后面跟上一个数字,表示第几个父提交,^相当于^1HEAD^2表示第二个父提交。

HEAD~2则相当于HEAD^^,也就是说可以用git reset --hard HEAD~10来代替git reset --hard HEAD后面加上连续的10个^

二、 Git分支

使用分支可以把工作从主线上分离出来,以免影响开发主线。

1. 创建分支

假如要创建一个名为test的分支,需要在命令行中输入:

$ git branch test

2. 切换分支

创建分支test之后,执行git branch查看所有的分支。

$ git branch
* master
  test

前面带*的是当前所在分支,当前的分支仍然是master,执行git checkout test来切换到test分支

$ git checkout test
Switched to branch 'test'

Git 2.23中增加了git switch命令用于切换分支,因此也可以用git switch test切换到test分支。

如果想省略创建分支的过程,使用git switch -c <branch>可以在创建并切换到新分支。

3. 合并分支

3.1 基本合并操作

在test分支上修改README并提交,然后切换到master分支向LICENSE写入一些内容并提交。使用git log --oneline --decorate --graph --all查看由ASCII字符绘制的提交历史:

$ git log --oneline --decorate --graph --all
* e2b2201 (HEAD -> master) modify LICENSE
| * f46719e (test) modify README
|/
* 250641f add LICENSE
* 0c79677 add README

这时提交记录出现了分叉,要把test分支上做的修改合并到master分支上,需要先切换master分支上,然后执行git merge命令:

$ git switch master
Switched to branch 'master'
$ git merge test
Merge made by the 'recursive' strategy.
 README | 1 +
 1 file changed, 1 insertion(+)
$ git log --oneline --decorate --graph --all
*   b134639 (HEAD -> master) Merge branch 'test' into master
|\
| * f46719e (test) modify README
* | e2b2201 modify LICENSE
|/
* 250641f add LICENSE
* 0c79677 add README

再次查看提交历史,发现两个分叉的提交已经合并成了一个新的提交。

3.2 快进式合并

现在切换到一个新分支issue1,然后依次提交两个修复补丁fix1和fix2,提交历史就变成了下面的结构:

$ git log --oneline --decorate --graph --all
* 8427f9a (HEAD -> issue1) fix 2
* 747da30 fix 1
*   b134639 (master) Merge branch 'test' into master
|\
| * f46719e (test) modify README
* | e2b2201 modify LICENSE
|/
* 250641f add LICENSE
* 0c79677 add README

把分支issue1合并到master,会发现合并时出现了“Fast-forward”的提示,这是因为当前分支master所指向的提交是issue1分支的直接上游,所以Git直接把master分支指针向前移动到了issue1的位置。

 git switch master
Switched to branch 'master'
❯ git merge issue1
Updating b134639..8427f9a
Fast-forward
 fix1 | 0
 fix2 | 0
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 fix1
 create mode 100644 fix2

合并后的提交记录如下:

* 8427f9a (HEAD -> master, issue1) fix 2
* 747da30 fix 1
*   b134639 Merge branch 'test' into master
|\
| * f46719e (test) modify README
* | e2b2201 modify LICENSE
|/
* 250641f add LICENSE
* 0c79677 add README

如果想要保留issue1分支,将其作为一条单独的分支,需要在合并时使用--no-ff参数关闭“快进式合并”。

3.3 处理合并冲突

如果要合并的两个分支上都修改了同一个文件的同一部分内容,合并时就会出现类似下面的信息,这时需要自己处理合并冲突。

$ git merge test
Auto-merging README
CONFLICT (content): Merge conflict in README
Automatic merge failed; fix conflicts and then commit the result.

Git会给有冲突的文件添加待解决冲突标记,现在打开发生冲突的文件README,内容如下:

 <<<<<<< HEAD
 xxxxx11111111
 22222222222

 =======
 11111111
 x22222222222

 >>>>>>> test

HEAD版本的内容在“=======”的上半部分,test分支的内容在下半部分,这里需要自己编辑文件解决冲突。解决冲突后再用git add把文件添加到暂存区,提交修改。

如果不想进行合并,使用git merge --abort来中止这次合并。

三、使用远程仓库

1. 新建远程项目

首先在gitee新建一个仓库learngit:

新建仓库后,克隆项目到本地:

2. 在本地开发并推送

获取项目仓库后,新建一个分支dev1,在dev1上模拟开发者1进行开发。

接下来在另一个文件夹模拟开发者2进行开发。

现在切换到开发者1,修改LICENSE并推送:

推送被拒绝了,这是因为开发者2已经先进行了推送,现在需要获取变更并合并,合并之后再执行git push推送即可。

3. 重新整理提交记录

经过若干次提交,提交记录变成了下图所示:

接下来把issue1的更改应用到dev1上。为了让提交记录更简洁,可以进行“变基“操作而不是简单的merge。首先,切换到issue1分支,然后执行git rebase dev1,这将把issue1上提交的更改以补丁的形式应用到分支dev1上。

最后切换到dev1分支,进行快进操作,让dev1指向最新的提交记录。

参考文献

五⼤场景玩转 Git,只要这一篇就够了!

《Pro Git 2》

posted on 2020-10-20 20:27  xiop  阅读(162)  评论(0)    收藏  举报