0%

Git

本章是整理知识内容,为强化知识长期更新。

Git速度查询表

下面是常用 的Git 命令清单。几个专用名词的译名如下:

  • Workspace:工作区
  • Index / Stage:暂存区
  • Repository:仓库区(或本地仓库)
  • Remote:远程仓库

最小配置

为什么要最小配置,每次提交代码需要告诉git。所以需要简单设置下user信息。

1
2
git config --global user.name 'your name'
git config --global user.email 'your email'

这里需要注意config的三个作用域

1
2
3
git config --local  #某个git本地仓库有效
git config --global #当前用户所有仓库有效,就是你系统的登陆用户。
git config --system #对系统所有的仓库都有效果。

我们一般只会使用local 和 global这两个配置。当我们配置好user.name user.email之后,我们可以检查下配置信息。

1
2
3
git config --list --local # 注意,必须在某个仓库里面才能看到。
git config --list --global
git config --list --system

创建一个本地仓库

一般来说git仓库有两种情况,一种是没有仓库,另外一种就是已经有仓库了。这里对第一种情况演示,因为工作中习惯在web上创建仓库。这里还是了解下。

1
git init git_learning 

创建一个README文件。

1
touch README.md

这里需要说明下,本地仓库创建完成后需要与远程仓库进行管理。

1
git remote add origin github.com:yourname/git_learning.git # 这里的yourname 是你的git账号

建议手动去github上面创建一个叫git_learning的仓库。上面的命令就是做下关联。

1
2
3
git add . # 将当前文件添加至暂存区
git commit -m "upload file" # 将暂存区的文件提交到本地仓库
git push origin mastet # 将本地仓库的改动信息推送到远程仓库中

可控一个远程仓库

1
2
# 克隆一个仓库
git clone www.**/**.git

文件追踪

有些时候不想提交部分文件,但是git add .的时候添加进去了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
## 添加文件到暂存区
git add [file] [file]

## 添加文件夹暂存区
git add [dir]

## 添加当前目录所有文件暂存区
git add .

## 如果是对所有文件都取消跟踪的话,就是
git rm -r --cached .    ## 不删除本地文件
git rm -r --f .    ## 删除本地文件

##对某个文件取消跟踪
git rm --cached readme1.txt ## 删除readme1.txt的跟踪,并保留在本地。
git rm --f readme1.txt ## 删除readme1.txt的跟踪,并且删除本地文件s

提交仓库

如果发现message写错了,可以修改下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 修改最新一次commit提交message。
git commit --amend

# 提交暂存区的指定文件到仓库区
git commit [file1] [file2] ... -m [message]

# 将本地暂存区的文件推送到本地仓库。 当修改已经通过`git add <change file>`将其添加到`stage`,可以通过`git commit -m "<message>"`为这所有已经进入`stage`的改变添加一个`commit`信息。
git commit -m

#可以直接使用`git commit -am "<message>"`,将所有修改,但未进`stage`的改动加入`stage`,并记录`commit`信息。(某种程度上相当于`git add`和`git commit -m`的组合技,前提是被改动文件已经是`tracked`)
git commit -am

#这个命令经常会出现在本地仓库与远程仓库发生冲突的时候,需要强制推送更新。
git push -f origin master

# 推送删除远程分支操作
git push origin : xxxx

# 推送删除远程分支操作
git push origin --delete xxxx

  • 如果想修改以往的commit的message。注意是不连续的commit。
    • 首先查看log 里面的信息,然后获取commitid进行合并

信息查看

如果我们需要查看commit 提交日志可以使用log命令,这里简单介绍下log。

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
28
29
30
31
32
33
34
35
36
37
38
# 查看查看本地仓库状态信息。
git status

#log信息一行显示
git log --oneline

#对比提交信息
git diff

# 显示暂存区和上一个commit的差异
git diff --cached [file]

# 显示工作区与当前分支最新commit之间的差异
git diff HEAD

# 显示两次提交之间的差异
git diff [first-branch]...[second-branch]

# 显示今天你写了多少行代码
git diff --shortstat "@{0 day ago}"

# 显示某次提交的元数据和内容变化
git show [commit]

# 显示某次提交发生变化的文件
git show --name-only [commit]

# 显示某次提交时,某个文件的内容
git show [commit]:[filename]

# 显示当前分支的最近几次提交
git reflog

# 自带的图形化命令看提交记录。
git log --oneline --graph

#log信息一行显示。且显示2条记录。
git log --oneline -n2

撤销

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 修改文件名称。
git mv -f xxx xxx

# 有的时候误将文件提交到__暂存区__,用这个命令可以删除掉。避免提交到远程仓库中。
git rm --cache xxxx

# 因为项目初始化的时候未正确配置排除文件导致部分文件一直保存在服务器中。所以需要远程删除下。
# 加上 -n 这个参数,执行命令时,是不会删除任何文件,而是展示此命令要删除的文件列表预览。
git rm -r -n —cached xxx

# 远程删除文件
git rm -r --cached xxx

# 删除错误版本提交,一般是就近的一个远程仓库版本。
git reset --soft xxx(版本号)

# 仅仅只是撤销已经提交的版本库和暂存区,工作去不受影响。这个操作通常是用来后悔提交的。工作去的代码依然有价值。
git reset --mixed xxx(版本号)

# 将工作去、暂存区、仓库版记录回复到某一个版本。这个操作非常犀利,尽量少用。
git reset --hard xxx(版本号)

分支

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 切换分支,若分支不存在则创建一个xxx分支。
git checkout xxx

# 查询当前工作分支
git branch --v

#查看远程分支
git branch -r

# 删除本地没有打开的分支。
git branch -d xxx

# 删除本地打开的分支
git branch -D xxx

# 删除远程仓库分支
git branch -r -d origin/xxxx

关闭大小写忽略

1
git config core.ignorecase false

量修改历史记录中的信息

进入该仓库目录,打开 git bash 界面,执行 git log 命令查看历史提交信息(重点关注 Author)。

  • 打开一个文本编辑器,粘贴下面代码。
    然后把 OLD_EMAIL,CORRECT_NAME,CORRECT_EMAIL 改成自己的新旧邮箱用户名。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

#!/bin/sh

git filter-branch --env-filter '

OLD_EMAIL="原来的邮箱"
CORRECT_NAME="现在的名字"
CORRECT_EMAIL="现在的邮箱"

if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

  • 特殊情况-如果上面的批量修改命令执行失败的话,执行一下这段命令:

bashgit filter-branch -f --index-filter 'git rm --cached --ignore-unmatch Rakefile' HEAD

git清理分支提交记录

1
2
3
4
5
6
7
8
9
10
11
12
1.Checkout 
git checkout --orphan latest_branch
2. Add all the files
git add -A
3. Commit the changes
git commit -am "commit message"
4. Delete the branch
git branch -D master
5.Rename the current branch to master
git branch -m master
6.Finally, force update your repository
git push -f origin master