Git 命令集合

分支相关

查询分支

git branch

创建分支

1
git checkout -b dev

git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

1
2
git branch dev
git checkout dev

查看当前分支

git branch命令查看当前分支:

1
2
3
4
lan@DESKTOP-8ISAT6B MINGW64 /D/dev/workspace/HexoTools (dev)
$ git branch
* dev
master

git branch命令会列出所有分支,当前分支前面会标一个*号。

切换分支

在dev分支的工作完成后,我们就可以切换回master分支:

1
2
3
4
lan@DESKTOP-8ISAT6B MINGW64 /D/dev/workspace/HexoTools (dev)
$ git checkout master
Switched to branch 'master'
lan@DESKTOP-8ISAT6B MINGW64 /D/dev/workspace/HexoTools (master)

合并分支

使用git merge 指定分支命令合并指定分支到当前分支。现在,把dev分支的工作成果合并到master分支上,

1
2
3
4
5
6
7
8
9
10
11
12
13
lan@DESKTOP-8ISAT6B MINGW64 /D/dev/workspace/HexoTools (master)
$ git merge dev
Updating ec6d299..616432d
Fast-forward
src/front/matter/tools/AddFrontMatter.java | 198 ---------
......
.../to/this_article/CurrentArticlesHyperlinks.java | 194 ++++++++
25 files changed, 1842 insertions(+), 1446 deletions(-)
delete mode 100644 src/front/matter/tools/AddFrontMatter.java
......
delete mode 100644 src/markdown/add/horizontal/line/AddHorizontalLine.java
......
create mode 100644 src/useless/generate/links/to/this_article/CurrentArticlesHyperlinks.java

注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。

删除分支

和并到主分支后,就可以删除dev分支了:

1
2
3
lan@DESKTOP-8ISAT6B MINGW64 /D/dev/workspace/HexoTools (master)
$ git branch -d dev
Deleted branch dev (was 616432d).

删除后,查看branch,就只剩下master分支了:

1
2
3
4
lan@DESKTOP-8ISAT6B MINGW64 /D/dev/workspace/HexoTools (master)
$ git branch
* master

忽略文件

忽略文件的便捷写法

.gitignore文件中,写入想要忽略的文件或者目录的相对地址即可。下面介绍一个快速写.gitignore文件的技巧:
打开git-bash,输入touch .gitignore创建.gitignore文件。然后输入:ls -ah >.gitignore命令把当前目录下所有的文件以及目录都写入到.gitignore文件中。这表示忽略项目中所有的目录以及文件。可以输入cat .gitignore命令所有忽略的文件或目录,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
lan@DESKTOP-8ISAT6B MINGW64 /d/dev/workspace/Coding (master)
$ cat .gitignore
./
../
.classpath
.git/
.gitignore
.project
.settings/
bin/
res/
src/

最后使用vim .gitigonre命令编辑文件,删除(按下dd)你要加入版本管理的文件以及目录,想要忽略的就保留。这样比我们手动的往里面写要快的多:

忽略已加入版本控制的文件

问题描述

.gitignore中已经标明忽略某个文件或目录,但是这个文件还是默认加到版本库中.

原因

如果某些文件已经被纳入了版本管理中,就算是在.gitignore中已经声明了忽略路径也是不起作用的,因为.gitignore只对还没有加入版本库的文件有效.
这个使用使用git rm命令可以从版本库中删除文件.

查看要从版本库中删除的文件

1
git rm -n --cached 文件

查看要从版本库中删除的目录

1
git rm -r -n --cached 目录

注意不要使用git rm -r --cached .这个命令很危险,有可能把IDE的配置文件给删掉,免得到时候打不开又得重新建工程。

实例:从版本库中移除一个文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
lan@DESKTOP-8ISAT6B MINGW64 /e/workspace/HexoTools (dev)
$ cat .gitignore
bin/
.settings/
*.txt
.project
.classpath
lan@DESKTOP-8ISAT6B MINGW64 /e/workspace/HexoTools (dev)
$ git status
On branch dev
...
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: HexoFrontMatter.txt
...

1.清除该文件的缓存

1
2
3
4
5
6
7
8
9
10
11
12
13
lan@DESKTOP-8ISAT6B MINGW64 /e/workspace/HexoTools (dev)
$ git rm -n --cached HexoFrontMatter.txt
rm 'HexoFrontMatter.txt'
lan@DESKTOP-8ISAT6B MINGW64 /e/workspace/HexoTools (dev)
$ git rm --cached HexoFrontMatter.txt
rm 'HexoFrontMatter.txt'
lan@DESKTOP-8ISAT6B MINGW64 /e/workspace/HexoTools (dev)
$ git status
On branch dev
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: HexoFrontMatter.txt
......

加上-n参数表示显示要即将要删除的文件,并不会真正则删除.这个参数用来验证自己删除的对不对,以免误删。

2.重新添加提交

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
lan@DESKTOP-8ISAT6B MINGW64 /e/workspace/HexoTools (dev)
$ git add .
lan@DESKTOP-8ISAT6B MINGW64 /e/workspace/HexoTools (dev)
$ git status
On branch dev
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: HexoFrontMatter.txt
......
lan@DESKTOP-8ISAT6B MINGW64 /e/workspace/HexoTools (dev)
$ git commit -m '
> 从版本库中移除日志文件(txt)'
[dev 191c3cd] 从版本库中移除日志文件(txt)
8 files changed, 134 insertions(+), 28 deletions(-)
delete mode 100644 HexoFrontMatter.txt
create mode 100644 src/find/not/fm/FindNotFM.java
rename src/tools/readlastlineinbigfile/{LastLineInFileTools.java => LastLineReader.java} (94%)
lan@DESKTOP-8ISAT6B MINGW64 /e/workspace/HexoTools (dev)
$ git status
On branch dev
nothing to commit, working tree clean

lan@DESKTOP-8ISAT6B MINGW64 /e/workspace/HexoTools (dev)

这个时候该txt文件已经从版本库中删除掉了,不过并不会删除工作区的文件,可以用ls命令查看:

1
2
$ ls
bin/ HexoFrontMatter.txt lib/ README.md res/ runable/ src/

实例:从版本库中移除目录

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
lan@DESKTOP-8ISAT6B MINGW64 /e/workspace/XunFeiTTS (dev)
$ git status
On branch dev
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: .settings/org.eclipse.core.resources.prefs
.......
no changes added to commit (use "git add" and/or "git commit -a")
lan@DESKTOP-8ISAT6B MINGW64 /e/workspace/XunFeiTTS (dev)
$ git rm -r -n --cached .settings/
rm '.settings/org.eclipse.core.resources.prefs'
lan@DESKTOP-8ISAT6B MINGW64 /e/workspace/XunFeiTTS (dev)
$ git rm -r --cached .settings/
rm '.settings/org.eclipse.core.resources.prefs'
lan@DESKTOP-8ISAT6B MINGW64 /e/workspace/XunFeiTTS (dev)
$ git add .
lan@DESKTOP-8ISAT6B MINGW64 /e/workspace/XunFeiTTS (dev)
$ git commit -m '
> 1.支持输入字符串合成音频
> 2.从版本库中移除IDE的配置文件目录.
> '
[dev bfd69df] 1.支持输入字符串合成音频 2.从版本库中移除IDE的配置文件目录.
5 files changed, 28 insertions(+), 28 deletions(-)
delete mode 100644 .settings/org.eclipse.core.resources.prefs
lan@DESKTOP-8ISAT6B MINGW64 /e/workspace/XunFeiTTS (dev)

克隆的仓库中 忽略已经加入文件的更新

问题描述

经过上一步,我已经从本地仓库中把一个文件彻底移除了,然后我用git push命令推送到远程仓库中,这样远程仓库也没有了该文件.

但是我之间在另一个目录中已经克隆了这个仓库,现在我叫这个仓库为克隆的仓库
我想在克隆的仓库中使用git pull进行更新,但是更新之后,克隆的仓库中还是存在这个文件(这是因为在克隆仓库中我修改了这个文件),那又怎么删除呢?
我这里不知道其他方法,最后我现在先删除本地克隆仓库,然后再从远程仓库中克隆。这样克隆的仓库中也就没有了这个文件了。

删除本地仓库

1
rm -rf MD/

重新克隆

现在重新克隆到本地仓库中,并重名为MD

1
git clone git@github.com:lanlan2017/markdown-command-line-generator.git MD

远程仓库

添加远程仓库

语法:git remote add 远程仓库别名 远程仓库地址
如下所示:

1
git remote add origin git@github.com:lanlan2017/GetWiFiPassWord.git

查看远程仓库

1
git remote -v

推送到远程仓库

推送到master分支:

1
git push origin master

如果是远程仓库是空的,第一次推送master分支时,则在push后面加上参数-u:

1
git push -u origin master

版本回退

查看版本日志

1
git log --pretty=oneline

显示效果如下:

1
2
3
4
5
$ git log --pretty=oneline
c8f251788d8cc9dd69b8622dd1bba0384f2a6d48 (HEAD -> master) 修改README.md文件
8304fffa30f0fd96d317244daaa327ada7f1af6d (origin/master, origin/HEAD) 修改代码输出文件使用相对路径
8f3abbee855216adfd92e7727e4c91204fd451c2 获取所有连接过的wifi密码.
931319f6d7f157fef8558662c5a23693cbf8178c Initial commit

这里可以看到远程仓库和本地仓库的信息。

撤销添加

使用git add命令之后,可以输入:

1
git reset HEAD

撤销本次添加,也可以输入:

1
git reset HEAD filename

撤销添加某个文件,例如要撤销添加src/mainclass/MMD.java这个文件可以输入:

1
git reset HEAD src/mainclass/MMD.java

回退到某次commit

1
git reset --hard commit_id  

撤销修改###

有时候会把代码写蹦了,这个时候就要撤销这次的修改。

撤销一个文件的修改

1
git checkout -- filename

撤销所有修改

有时候,可能修改了不止一个文件,一个个的修改比较麻烦,所以要,撤销所有的修改:

1
git checkout .

删除新增文件

上面的撤销修改只能对已经修改的文件有效,但是如果你新创建了一些新的文件的话,这些文件没有添加到版本库中,是不会自动删除掉的,使用如下命令删除这些新增的文件:

1
git clean -df

冲突

产生冲突的情况

两个分支``都分别有新的提交的时候,在合并的时候就会出现冲突.

查找冲突的文件

使用git status可以看到发生冲突的文件:

1
2
3
4
5
6
7
8
9
10
11
lan@DESKTOP-8ISAT6B MINGW64 /d/dev/workspace/MarkdownTools (master|MERGING)
$ git status
On branch master
Your branch is up to date with 'origin/master'.
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: src/delete/Delete.java
no changes added to commit (use "git add" and/or "git commit -a")

注意其中的这两个提示:

1
both modified:   src/delete/Delete.java

这说明src/delete/Delete.java这个文件冲突了。

修改冲突的文件

首先不要慌张.git已经合并了没有冲突的地方,我们只需要修改上面两个文件中发生冲突的地方即可.现在打开冲突的文件src/delete/Delete.java然后修改git提示的有冲突的地方,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
    public static String deleteSpacesBetweenChinese(String text)
{
// 删除英文空格
text = text.replaceAll("([\\u4e00-\\u9fa5])\\s+([\\u4e00-\\u9fa5])",
"$1$2");
// 删除中文空格
text = text.replaceAll("[ ]+", "");
<<<<<<< HEAD
=======
text = text.replaceAll(" ", "");
>>>>>>> dev
return text;
}

Git用<<<<<<<=======>>>>>>>标记出不同分支的中有冲突的地方如下所示:

1
2
3
4
<<<<<<< HEAD
=======
text = text.replaceAll(" ", "");
>>>>>>> dev

等号分割了两个分支,上面的是HEAD分支的新内容,这里为空,等号下面的是dev分支上的新内容。修改这部分内容,然后删掉<<<<<<< HEAD这些提示符就行了。这步叫做手动解决冲突

再次提交

然后再次添加,然后再次提交.

1
2
3
4
5
6
7
lan@DESKTOP-8ISAT6B MINGW64 /d/dev/workspace/MarkdownTools (master|MERGING)
$ git add .
lan@DESKTOP-8ISAT6B MINGW64 /d/dev/workspace/MarkdownTools (master|MERGING)
$ git commit -m '
> 合并冲突'
[master 7d0e456] 合并冲突
lan@DESKTOP-8ISAT6B MINGW64 /d/dev/workspace/MarkdownTools (master)

切换分支合并修改

这样master分支上就没有冲突了,接着切换到dev分支,然后dev分支合并没有冲突的master分支,这样两者就都没有冲突了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
lan@DESKTOP-8ISAT6B MINGW64 /d/dev/workspace/MarkdownTools (master)
$ git checkout dev
Switched to branch 'dev'
lan@DESKTOP-8ISAT6B MINGW64 /d/dev/workspace/MarkdownTools (dev)
$ git merge master
Updating 9d7c83e..7d0e456
Fast-forward
M.jar | Bin 25388 -> 25372 bytes
src/add/Add.java | 2 +-
src/delete/Delete.java | 2 +-
3 files changed, 2 insertions(+), 2 deletions(-)

lan@DESKTOP-8ISAT6B MINGW64 /d/dev/workspace/MarkdownTools (dev)
$ git status
On branch dev
nothing to commit, working tree clean

显示分支的合并情况

1
git log --graph --pretty=oneline --abbrev-commit

如果提交过多的,可以加上-n参数指定显示提交的次数.例如下面指定显示提交最近8个分支.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
lan@DESKTOP-8ISAT6B MINGW64 /d/dev/workspace/MarkdownTools (dev)
$ git log -8 --graph --pretty=oneline --abbrev-commit
* 7d0e456 (HEAD -> dev, master) 合并冲突
|\
| * 9d7c83e `dsbc`参数对应的方法中加入移除中文全角空格的功能.
* | 87ef36d (origin/master) 修改`dsbc`参数对应方法中匹配中文空格的正则表达式,支持匹配多个中文空格.
|\ \
| |/
| * cfef0c2 在dsbc参数对应的方法中,添加删除中文空格的功能.^
* | d5527e8 修改参数 enhl对应的方法.\r\n支持\xxxx格式的linux格式路径.
|/
* c51cc3b 修改 enhl参数方法,支持后缀名.xxx以及路径/xxxx的高亮.
* 1c18026 update .gitignore
* bd63151 update .gitignore

git rebase 进行 git 压缩

压缩最近的分支

这个命令不是很熟悉,后面再了解了解.

强制覆盖远程仓库

1
git push origin master --force

查看分支时间

1
git reflog show --date=iso <branch name>

运行效果:

1
2
3
4
$ git reflog show --date=iso master
bfd69df (HEAD -> dev, origin/master, origin/HEAD, master) master@{2019-05-25 00:24:04 +0800}: merge dev: Fast-forward
0dab55b master@{2019-05-23 13:49:04 +0800}: merge dev: Fast-forward
...

参考链接

Pro Git
创建与合并分支|廖雪峰的官方网站
.gitignore忽略已加入版本控制的文件
添加远程库
Git 合并多次 commit 、 删除某次 commit
git如何移除某文件夹的版本控制