02-常见场景

删除不需要的分支

git branch -d/-D <分支名>

修改最新commit的message

git commit -amend

# :wq! 保存退出

修改旧commit的message

git rebase -i <commitID的parent>

# 在交互界面中进行如下操作
# 步骤一,选择要进行的操作
#:wq!
# 步骤二,进行操作
# :wq!

已经集成到团队分支中,不可进行这样的操作。

合并多个连续的commit

git rebase -i  <commitID的parent>

#  在交互界面进行如下操作
# 步骤一,选择一个pick和多个squash
#  : wq!
# 步骤二,新增一条commit message
# : wq!

合并多个间隔的commit

git rebase -i <commitID的parent>

#  如果某个commit没有父commit,那么就选择该commit后,手动将它添加到交互界面中

# 将需要合并的commit剪切到一起,需要被合并的修改为squash,不变的依然是pick
# :wq!

git rebase --continue

#  修改commit信息
# :wq!

比较暂存区和HEAD所含文件的差异

git diff --cached

比较工作区和暂存区所含文件的差异

git  diff   # 比较工作区和暂存区的所有文件

git diff  -- <file>  # 比较该文件在工作区和暂存区的差别

将暂存区恢复成与HEAD一致

git reset HEAD  #针对暂存区全部文件

git rest HEAD -- <file1>  <file2># 针对暂存区中某个文件

将工作区文件恢复成与暂存区一致

git  checkout   # 针对工作区全部文件

git  checkout --  <file>    # 针对工作区某个文件

消除最近的几次提交

git reset --hard <commitID> # commitID之后的commit记录都会被删除

查看不同提交的指定文件的差异

git diff  <branch1> <branch2>   # 比较两个分支全部文件的不同
git diff  <commitID1> <cimmitID2>

git diff  <branch1> <branch2> -- <file> # 比较两个分支中指定文件的不同
git diff  <commitID1> <cimmitID2> -- <file>

正确删除文件的方法

git rm <file>

临时加塞紧急任务如何处理

git stash   # 将当前工作区中文件存入临时堆栈中

git stash list  # 查看临时堆栈中内容

git stash apply # 复制临时堆栈的内容到工作区
git stash pop <stash序号>  # 提取临时堆栈的内容到工作区,默认为顶部内容

指定不需要Git管理的文件

.gitignore文件

  1. 空行不匹配任何文件,因此它可以作为可读性的分隔符。

  2. 以#开头的行作为注释。对于以哈希开头的模式,在第一个哈希前面加一个反斜杠(“\”)。

  3. 除非使用反斜杠(“\”)引用尾随空格,否则将忽略尾随空格。

  4. 可选前缀“!”否定了这种模式;之前模式排除的任何匹配文件将再次包含在内。如果排除该文件的父目录,则无法重新包含文件。出于性能原因,Git不会列出排除的目录,因此无论在何处定义,所包含文件的任何模式都不起作用。在第一个“! ”前放一个反斜杠(“\”)对于以文字“!”开头的模式,例如“\!important!.txt”。

  5. 如果模式以斜杠结尾,则为了以下描述的目的将其删除,但它只会找到与目录的匹配项。换句话说,foo /将匹配目录foo和它下面的路径,但是不匹配常规文件或符号链接foo(这与pathpec在Git中的工作方式一致)。

  6. 如果模式不包含斜杠/,Git将其视为shell glob模式,并检查相对于.gitignore文件位置的路径名匹配(相对于工作树的顶层,如果不是来自.gitignore)文件)。

  7. 否则,Git将模式视为shell glob:“*”匹配除“/”,“?”之外的任何内容。匹配除“/”之外的任何一个字符,“[]”匹配所选范围中的一个字符。有关更详细的说明,请参阅fnmatch(3)和FNM_PATHNAME标志。

  8. 前导斜杠与路径名的开头匹配。例如,“/*.c”匹配“cat-file.c”但不匹配“mozilla-sha1 / sha1.c”。

与完整路径名匹配的两个连续星号(“**”)可能具有特殊含义:

  • 前面的斜杠“”表示匹配所有目录。例如,“/foo”在任何地方匹配文件或目录“foo”,与模式“foo”相同。 “**/foo/bar”将文件或目录“bar”与直接位于“foo”目录下的任何位置匹配。

尾随“/”匹配内部的所有内容。例如,“abc/”匹配目录“abc”内的所有文件,相对于.gitignore文件的位置,具有无限深度。

斜杠后跟两个连续的星号,然后斜杠匹配零个或多个目录。例如,“a/**/b”匹配“a/b”,“a/x/b”,“a/x/y/b”等。

其他连续的星号被认为是常规星号,并且将根据先前的规则匹配。

将Git仓库备份

git clone --bare  <协议及仓库地址>    # 不带工作区的裸仓库

git remote -v   # 查看远端仓库
git remote add <remove name> <协议及仓库地址>

git push  --set-upstream

常用传输协议

常用协议语法格式说明
本地协议1/path/to/repo.git哑协议
本地协议2file:///path/to/repo.git智能协议
http/https协议http(s)://git-server.com:port/path/to/repo.git平时接触到的都是智能协议
ssh协议user@git-server.com:path/to/repogit工作中最常用的智能协议

哑协议与智能协议

  • 直观区别:哑协议传输进度不可见,智能协议可见
  • 传输速度:智能协议比哑协议快
上次修改: 14 April 2020