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^表示当前提交从左到右的第一个父提交,当一个提交有多个父提交时,可以通过在^后面跟上一个数字,表示第几个父提交,^相当于^1,HEAD^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指向最新的提交记录。
浙公网安备 33010602011771号