导航
导航
文章目录
  1. 一、Git 软件配置
    1. 1.1 基础配置
    2. 1.2 关于换行符问题
    3. 1.3 手动编辑配置文件
  2. 二、创建代码仓库
    1. 2.1 通过SSH克隆远程代码仓库
    2. 2.2 通过https克隆远程代码仓库
    3. 2.3 在本地创建代码仓库
  3. 三、Git 基本操作
    1. 3.1 添加与提交
    2. 3.2 查看提交历史
    3. 3.3 检出之前的提交
  4. 四、Git 撤消操作
    1. 4.1 git reset 清除缓冲区/工作目录
    2. 4.2 git revert 回滚到特定版本,生成新提交
    3. 4.3 git clean 移除未跟踪文件
    4. 4.4 commit --amend 修改上一次提交
    5. 4.4 git rebase 完整合并当前分支所有提交

记录常用GIT的命令

一、Git 软件配置

1.1 基础配置

1
2
3
4
git config --global user.name <name> # 定义全局作者姓名
git config --global user.email <email> # 定义全局作者邮箱
git config --system core.editor <editor> # 定义默认编辑器
git config --global alias.<alias-name> <git-command> # 自定义Git命令别名

1.2 关于换行符问题

AutoCrlf 设置

  • windows 系统换行符是 CRLF,linux 系统是 LF
  • input 表示提交时转换为 LF,检出时不转换(适用linux系统,建议使用)
  • true 表示提交时转换为 LF,检出时转换为 CRLF (适用windows系统)
  • false 表示均不转换
1
git config --global core.autocrlf input

SafeCrlf 设置

  • true 表示拒绝提交包含混合换行符的文件
  • false 表示允许提交包含混合换行符的文件
  • warn 表示当提交包含混合换行符的文件时给出警告
1
git config --global core.safecrlf warn

1.3 手动编辑配置文件

1
git config --global --edit
  • /.git/config 特定仓库的设置
  • ~/.gitconfig 特定用户的设置(–global标记)
  • $(prefix)/etc/gitconfig 系统层面的设置

优先级:仓库>用户>系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[core]
autocrlf = input
safecrlf = warn
excludesfile = .gitignore_global
editor = vim
[user]
name = WangYan
email = i@wangyan.org
[merge]
tool = vimdiff
[alias]
st = status
co = checkout
br = branch
up = rebase
ci = commit

二、创建代码仓库

2.1 通过SSH克隆远程代码仓库

1
git clone username@host:/path/to/repository

提示:可以通过添加 --bare 或者 --mirror 参数检出 裸仓库

2.2 通过https克隆远程代码仓库

1
git clone https:/path/to/repository.git

提示:通过HTTPS检出的仓库,今后提交代码需要帐号密码登录,SSH检出的仓库可以通过密钥登录。

2.3 在本地创建代码仓库

1
2
3
git init #在当前目录创建
git init <directory> #在指定目录创建
git init --bare <directory.git> #创建裸仓库

裸仓库不存在工作目录,不能编辑文件和提交,约定后缀是.git
为什么要有裸仓库?例如从A克隆出B,B是无法向A推送的,所以中心仓库必然是裸仓库(例如github)
裸仓库一般创建在git服务端,用于多人协作,所以不会在本地创建

如何理解裸仓库? Git 本地仓库和裸仓库

三、Git 基本操作

3.1 添加与提交

1
2
3
git status # 查看状态
git add . # 跟踪所有文件并且添加到缓存区
git commit -m "<message>" # 将缓存区提交到本地代码仓库

3.2 查看提交历史

1
2
3
4
5
6
7
8
9
10
# 显示完整项目历史,空格键滚动,按q退出。
git log

# 搜索注释中匹配的提交,<pattern>可以是字符串或正则表达式。
git log --grep="<pattern>"

# `--graph` 标记会绘制一幅字符组成的图形,左边是提交,右边是提交信息。
# `--decorate` 标记提交所在的分支名称和标签。
# `--oneline` 标记将提交信息显示在同一行。
git log --graph --decorate --oneline

3.3 检出之前的提交

git checkout 命令有三个不同的作用:检出提交、检出文件、检出分支

检出此前某个提交(所有文件)

1
2
3
4
git log --oneline # 先查看版本的ID
git checkout f254b5f # 切换到具体某个版本(HEAD指到f254b5f)
git reset --hard HEAD # 搞错了,回到f254b5f提交时的状态
git checkout master # 不玩了,切回默认master分支

检出此前提交某个文件(具体到某个文件)

1
2
3
4
5
# 将file1检出到f254b5f版本
# 注意此时file1状态变成“需要提交的更改”
git checkout f254b5f file1
# 不玩了,将file1切回来
git checkout HEAD file1

切换到某个分支

1
2
git checkout <branch>
git checkout -b <branch> #如果不存在,则新建一个分支

四、Git 撤消操作

4.1 git reset 清除缓冲区/工作目录

从缓存区移除特定文件

1
2
3
4
# 缓存了目录下所有文件
git add .
# 搞错了,我只想提交一个文件,故从缓存区移除多余文件file
git reset <file>

既重设了缓冲区,又重设了工作目录,清除了所有未提交的更改

1
git reset --hard

将缓冲区和工作目录重设到指定版本

1
2
git reset --hard <commit>
git reset --hard HEAD~2 # 删掉此前两次提交两个提交

注意:请不要 git reset 一个已经推送到远程仓库的提交。

4.2 git revert 回滚到特定版本,生成新提交

  • 使用 revert 命令会生成一个新的提交,所有文件回滚到此前某个版本
  • 安全撤销方式,但错误的提交依然在代码仓库(用于撤销已经发布的错误)
1
git revert <commit>

4.3 git clean 移除未跟踪文件

1
2
3
4
git clean -n # 移除未跟踪文件测试
git clean -f <path> # 移除未跟踪的文件,但限制在某个路径下
git clean -df # 移除未跟踪的文件,以及目录
git clean -xf # 移除当前目录下未跟踪的文件,以及Git一般忽略的文件

4.4 commit --amend 修改上一次提交

  • 将缓存区文件和上一次提交合并,产生一个全新的提交,这个新的提交会替换掉上一个提交。
  • 如果缓存区没有文件,运行这个命令可以用来编辑上次提交的提交信息。
1
git commit --amend

注意:请不要修复一个已经推送到远程仓库的提交,因为修复过的提交事实上是全新的提交,之前的提交会被移除出项目历史。

4.4 git rebase 完整合并当前分支所有提交

1
2
# 将当前分支rebase到<base>,可以是ID、分支名、标签,或是HEAD的相对引用
git rebase <base>

git merge 不同 git rebase 可以保持一个线性的项目历史,区别在哪?请看下面实例:

情景:在feature分支开发新特性时,发现master主分支有bug,于是建立hotfix修复分支,完后还要将feature分支合到已修复bug的主分支中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

git checkout -b feature master # 基于主分支建立feature分支开发新特性

git commit -a -m "developing a feature" #假设完工后,feature分支有c2、c3两次提交


git checkout -b hotfix master # 基于主分支建立bug修复分支

git commit -a -m "Fix security hole" #假设bug修复后,hotfix分支有c4、c5两次提交


# 切换到master分支,合并hotfix分支修复bug
# 注意这个时候我们用 `git merge` ,这里产生了新的提交"Merge branch hotfix"(c6)
# 因为我们不需要bug分支的提交历史,于是删除hotfix分支,现主分支记录是c1,c6

git checkout master #切换

git merge hotfix #合并

git branch -d hotfix #删除

# 与切换到master分支合并hotfix分支不同,这里我们是切换到feature分支来rebase主分支master
# rebase操作后,重点来了,master分支提交记录是c1,c2,c3 (feature分支记录完整保留了)

git checkout feature

git rebase master #将所在的feature完整移动到master分支最上面。

看起来c2,c3是feature原来的快照,其实已经是新的提交了,故请永远不要rebase那些已经推送到远程仓库的提交。

支持一下
扫一扫,支持一下