Git笔记-廖雪峰的Git教程

参考: 廖雪峰的Git教程

1. 版本库

1.1 创建版本库

1
2
3
4
5
git init # 将目录初始化为版本库(路径不要有中文名),会生成`.git`目录

git add <fileName> # 将文件添加到仓库的暂存区

git commit -m "文本说明" # 提交修改,将暂存区的内容提交到当前分支
  1. 所有版本控制系统只能追踪文本文件的改动,无法追踪二进制文件(如图片、视频、word)的改动
  2. 不要用windows自带的记事本编辑文件,他会在保存UTF-8编码的文件时在开头加上0xefbbbf(十六进制)的字符

1.2 查看版本库

1
2
3
4
5
git status #查看仓库状态,是否有文件被修改

git diff <fileName> #查看文件修改历史

git diff HEAD -- <fileName> #查看工作区中的fileName文件和版本库中的最新版本的区别

1.3 版本回退

1
2
3
4
5
6
7
8
9
10
11
# 显示提交历史,可加上`--pretty=oneline`精简显示
git log

# 退回到上一个版本,`HEAD^`指的是上一个版本,`HEAD^^`指上上个版本,`HEAD~100`指上100个版本
git reset --hard HEAD^

# 回退到指定的版本号,版本号可用`git log`查看,且不用写全,只要写前几个字母即可。
git reset --hard <commitID>

# 查看命令历史,也可用于确定要回退的版本号
git reflog

1.4 撤销修改

1
2
3
4
5
6
7
8
# 放弃对工作区fileName文件的修改。
# 若修改后的文件还没添加到暂存区,则会回到版本库中的状态。
# 若修改后的文件已经添加到暂存区,则会回到暂存区中的状态;此时若想放弃修改,需要先使用下一条指令,在使用这条指令。
git checkout -- <fileName>

# 放弃对暂存区fileName文件的修改,将其修改回退到工作区。
# 此时工作区中的文件是修改后的状态,若想撤销工作区中的修改,可用上一个指令。
git reset HEAD <fileName>

1.5 删除文件

1
2
3
git rm <fileName> # 从版本库中删除fileName文件

git checkout -- <fileName> # 若在工作区中误删了文件,可用这条指令从版本库中恢复此文件

2. 远程库

2.1 添加远程库

1
git remote add <repository_name> <URL> # 关联远程库,名字起做repository_name,一般都会使用origin

若本地库以及关联一个远程库,会导致添加失败:

1
2
git remote -v # 查看远程库
git remote rm origin # 删除已关联的远程库

2.2 推送到远程库

1
2
3
4
5
6
7
# 把本地分支推送到origin库的master分支。
# 若第一次提交本地master分支,可在`push`后加上`-u`参数,
# 使得本地master分支和远程master分支关联起来,之后再次提交可直接使用此条指令。
git push origin <local_branch>

# 把本地的local_branch分支,提交到origin库的remote_branch分支。
git push origin <local_branch>:<remote_branch>

2.3 从远程库克隆

1
git clone <URL> # 从URL地址下载文件到本地。

3. 分支管理

3.1 创建与合并分支

在只有一个分支的仓库中,HEAD指向master,master指向提交。每次提交时,master向前移动一步。

创建新分支时,新分支指向master的指向位置;切换分支时,改变的是HEAD的指向。

1
2
3
4
5
6
7
8
9
10
11
12
git branch <branch_name> # 创建指定分支

git checkout/switch <branch_name> # 切换指定分支。

git checkout -b <branch_name> # 创建并切换到指定分支。
git switch -c <branch_name> # 创建并切换到指定分支。

git branch # 显示所有分支,并标重当前分支

git merge <branch_name> # 合并指定分支到当前分支

git branch -d <branch_name> # 删除指定分支

因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。

3.2 解决冲突

若两个分支均对同一个文件进行修改,在提交时则会产生冲突。

1
2
3
4
5
6
git status # 查看冲突的文件。
# 此时打开冲突文件,文件中被两个分支修改的内容
# 会用`<<<<<<< 分支一修改内容 ======= 分支二修改内容 >>>>>>>`标记出来,
# 手动修改后再次提交即可解决。

git log --graph --pretty=oneline --abbrev-commit # 显示分支合并图。

3.3 分支管理模式

Fast Forward模式:默认模式,直接修改分支指针指向的位置;但在删除分支后会丢失分支信息,看不出之前进行过合并。

1
2
3
# 不使用FF模式合并分支。
# 在merge时生成一个新的commit,所以加上`-m`参数,把commit描述写进去。
git merge --no-ff -m "merge with no-ff" <branch_name>
  1. master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活。
  2. 在新的分支上干活(例如dev分支),发布时,再将dev合并到master上。
  3. 每个成员在自己的分支上干活,不时地合并到dev分支即可。

3.4 BUG分支

当前正在dev分支工作的时候,在master分支上有个紧急BUG(代号101)需要修复。

  1. 此时先“储藏”dev分支:git stash
  2. 然后从master分支创建临时分支,修改BUG,提交修改,合并分支,删除临时分支。
  3. 将修改应用到dev分支:切换到dev分支,git cherry-pick <commit_ID>,会在dev分支上创建一个新的提交。
  4. 查看“储藏列表”:git stash list
  5. 恢复之前工作现场:git stash pop或者git stash apply <stash_ID>+git stash drop <stash_ID>

    3.5 Feature分支

    开发一个新feature,最好新建一个分支,在新分支上开发:git switch -c feature-XXXX
    如果要丢弃一个没有被合并过的分支:git branch -D feature-XXXX强行删除。

    3.6 多人协作

    远程仓库名称默认为origin
    1
    2
    3
    4
    git origin	# 查看远程库
    git origin -v # 查看远程库

    git checkout -b <local_branch> origin/<remote_branch> # 创建远程库的分支到本地库
    多人协作的工作模式:
  6. 首先,可以试图用git push origin <local_branch>推送自己的修改;
  7. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
  8. 如果合并有冲突,则解决冲突,并在本地提交;
  9. 没有冲突或者解决掉冲突后,再推送就能成功!

如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <remote_branch> origin/<local_branch>

3.7 Rebase

1
git rebase # 可以把本地未push的分叉提交历史整理成直线

由3.6可知,在我们推送之前,若有同伴对远程库先push了,我们需要先pull再push。
但是通过git log可知,在我们pull之后,本地的提交历史会分叉。
分叉的提交需要进行三方对比,浪费时间精力,此时可以通过rebase将分叉的提交历史变为直线。

4. 标签管理

Git的标签是版本库的快照,指向某个commit的指针,但是与分支不同的是他不能移动。
因此通过标签可以取出某个提交版本。

4.1 创建标签

1
2
3
4
5
git tag <tag_name> # 先切换到要打标签的分支,然后用此命令,默认打在最新的commit上。

git tag <tag_name> <commit_id> # 若想打在历史commit上,可先用`git log`找到对应的commit_id,然后用此命令

git tag -a <tag_name> -m <message> <commit_id> # 创建带说明的标签

4.2 查看标签

1
2
3
git tag # 列出所有标签,按字母排序

git show <tag_name> # 查看标签信息

标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。

4.3 操作标签

1
2
3
4
5
6
7
8
9
git tag -d <tag_name> # 删除本地标签

git push origin <tag_name> # 将标签推送到远程库

git push origin --tags # 将所有未推送的标签推送到远程库

# 删除远程库的标签:先从本地删除,再从远程删除
git tag -d <tag_name>
git push origin :refs/tags/<tag_name>

5. Git设置

5.1 设置用户名和邮箱

1
2
git config --global user.name "Your Name"
git config --global user.email "Your Email"

5.2 忽略文件

在Git根目录创建.gitignore文件。
GitHub为我们准备的配置文件

语法规则:

符号 说明
# 注释
/a.txt 忽视当前目录下的a.txt
build/ 忽视所有的build文件夹
/build/ 忽视当前目录下的build文件夹
* 通配多字符
? 通配单字符
!a.txt 不忽视a.txt
[] 匹配括号内的任一字符
## 5.3 为指令配置别名
1
git config --global alias.<name> <command> # 为command指令命名为name,之后可用name代替command指令。
配置文件:本地仓库目录下的.git/config或用户目录下的.gitconfig
0%