Git常用命令速查表
1. git 几个专用名词
- Workspace:工作区
- Index / Stage:暂存区【工作区的文件使用add命令后会加入暂存区,而没有直接到仓库】
- Repository:仓库区(或本地仓库)
- Remote:远程仓库
2. 常用 git 命令清单
一、git配置
Git的设置文件为.gitconfig,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)。
Git有一个工具被称为git config,它允许你获得和设置配置变量;
这些变量可以控制Git的外观和操作的各个方面。这些变量可以被存储在三个不同的位置:
1./etc/gitconfig 文件:包含了适用于系统所有用户和所有库的值。
如果你传递参数选项’--system’ 给 git config,它将明确的读和写这个文件。
2.~/.gitconfig 文件 :具体到你的用户。你可以通过传递--global 选项使Git 读或写这个特定的文件。
3.位于git目录的config文件 (也就是 .git/config) :无论你当前在用的库是什么,特定指向该单一的库。
每个级别重写前一个级别的值。
因此,在.git/config中的值覆盖了在/etc/gitconfig中的同一个值。
[core] repositoryformatversion = 0 filemode = false bare = false logallrefupdates = true symlinks = false ignorecase = true [remote "origin"] url = https://AlexFly@bitbucket.org/AlexFly/springbootdemo.git fetch = +refs/heads/*:refs/remotes/origin/* [branch "master"] remote = origin merge = refs/heads/master [gitflow "branch"] master = master develop = develop [gitflow "prefix"] feature = feature/ release = release/ hotfix = hotfix/ support = support/ versiontag = [branch "develop"] remote = origin merge = refs/heads/develop [gui] wmstate = normal geometry = 835x475+75+75 185 214 [user] name = AlexFly email = fly910905@gmail.com
在Windows系统中,Git在$HOME目录中查找.gitconfig文件(对大多数人来说,位于C:\Documents and Settings\$USER下)。
它也会查找/etc/gitconfig,尽管它是相对于Msys 根目录的。这可能是你在Windows中运行安装程序时决定安装Git的任何地方。
# 显示当前的Git配置
git config --list
# 编辑Git配置文件
git config -e [--global]
# 设置提交代码时的用户信息
git config [--global] user.name "[name]"
git config [--global] user.email "[email address]"
二、新建代码库
# 在当前目录新建一个Git代码库
git init
# 新建一个目录,将其初始化为Git代码库
git init [project-name]
# 下载一个项目和它的整个代码历史
git clone [url]
git clone [url] mydir
使用此命令会将远程仓库最新版本的项目复制到本地一个新建文件夹中,文件夹往往为项目名,
如果希望在克隆时,自己定义项目名称,可以指定实现:
# 查看当前文件的状态
git status
三、增加/删除文件
# 添加指定文件到暂存区
git add [file1] [file2] ...
# 添加指定目录到暂存区,包括子目录
git add [dir]
# 添加当前目录的所有文件到暂存区
git add .
如果我们想从已跟踪文件(暂存区域)中移除文件,并连带从工作目录中删除指定的文件,可以使用git rm 命令。
如果删除之前修改过并且已经放到暂存区域的话,则必须
要用强制删除选项 -f ,以防误删除文件后丢失修改的内容。- 如果我们仅仅想移除跟踪但不删除文件,可以加上–cached参数,
# 删除工作区文件,并且将这次删除放入暂存区
git rm [file1] [file2] ...
# 停止追踪指定文件,但该文件会保留在工作区【让文件状态恢复到连 add 也没有过的时候】
git rm --cached [file]
# 改名文件,并且将这个改名放入暂存区
git mv [file-original] [file-renamed]
$ git mv test1 dir/test2 $ git status On branch master Changes to be committed: (use “git reset HEAD …” to unstage) renamed: test1 -> dir/test2 如果我们只是单纯地使用Linux命令mv,git不会智能跟踪, $ mv dir/test2 test1 $ git status On branch master Changes not staged for commit: (use “git add/rm …” to update what will be committed) (use “git checkout – …” to discard changes in working directory) deleted: dir/test2 Untracked files: (use “git add …” to include in what will be committed) test1
git clean –n——删除本地工作目录中的未追踪文件。
–n 表示试运行,在试运行中什么都不会删除。
-f 表示实际删除文件。
-d 表示删除未追踪的目录。
分支的增删查改
- 查看分支:git branch
- 查看远程所有分支:git branch -r
- 查看本地和远程所有分支:git branch -a
- 创建分支:git branch
<name>
- 切换分支:git checkout
<name>
- 创建并切换分支:git checkout -b
<name>
- 合并某分支到当前分支:git merge
<name>
- 把分支推送到远程:git push origin
<name>
- 删除本地分支:git branch (-d | -D)
<name>
- 删除远程分支:git push origin -d
<name>
- 分支重命名:git branch (-m | -M)
<oldbranch>
<newbranch>
注意: 不能删除当前所在本地分支。
四、代码提交
# 提交暂存区到仓库区
git commit -m [message]
# 提交暂存区的指定文件到仓库区
git commit [file1] [file2] ... -m [message]
# 提交工作区自上次commit之后的变化,直接到仓库区
git commit -a
# 提交时显示所有diff信息
git commit -v
# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
git commit --amend -m [message]
# 重做上一次commit,并包括指定文件的新变化
git commit --amend [file1] [file2] ...
五、分支
- 如
git branch child
,则会创建一个名为child的分支,此外,它有一些常用的参数:
参数 | 解释 |
-v | 用于查看各个分支的最后一次commit信息 |
-d | 删除分支。 |
-r | 查看远程主机分支 |
-a | 查看所有分支。 |
–merge | 查看哪些分支已被当前分支合并 |
–no-merge | 查看尚未合并的工作,如果其中的分支还包含尚未合并的工作,而我们尝试使用git branch -d 删除时,我们会被提示: error: The branch 'xxxxx' is not an ancestor of your current HEAD. ,如果想要强制删除的话,可以使用git branch -D xxxxx |
# 列出所有本地分支
git branch
# 列出所有远程分支
git branch -r
# 列出所有本地分支和远程分支
git branch -a
# 新建一个分支,但依然停留在当前分支
git branch [branch-name]
# 新建一个分支,并切换到该分支
git checkout -b [branch]
# 新建一个分支,指向指定commit
git branch [branch] [commit]
# 新建一个分支,与指定的远程分支建立追踪关系
git branch --track [branch] [remote-branch]
# 切换到指定分支,并更新工作区
git checkout [branch-name]
# 建立追踪关系,在现有分支与指定的远程分支之间
git branch --set-upstream [branch] [remote-branch]
# 合并指定分支到当前分支
git merge [branch]
# 选择一个commit,合并进当前分支
git cherry-pick [commit]
命令 git cherry-pick 通常用于把特定提交从存储仓库的一个分支引入到其他分支中。常见的用途是从维护的分支到开发分支进行向前或回滚提交。
这与其他操作(例如:合并(merge)、变基(rebase))形成鲜明对比,后者通常是把许多提交应用到其他分支中。
# 删除分支
git branch -d [branch-name]
# 删除远程分支
git push origin --delete [branch-name]
git branch -dr [remote/branch]
是么时候使用“git rebase”代替“git merge”?
这两个命令都是把修改从一个分支集成到另一个分支上,它们只是以非常不同的方式进行。
考虑一下场景,在合并和变基前:
A <- B <- C [master]
^
\
D <- E [branch]
在 git merge master 之后:
A <- B <- C
^ ^
\ \
D <- E <- F
在 git rebase master 之后:
A <- B <- C <- D <- E
使用变基时,意味着使用另一个分支作为集成修改的新基础。
何时使用:
如果你对修改不够果断,请使用合并(git merge)操作。
根据你希望的历史记录的样子,而选择使用变基(git rebase)或合并(git merge)操作。
更多需要考虑的因素:
- 分支是否与团队外部的开发人员共享修改(如开源、公开项目)?如果是这样,请不要使用变基操作。变基会破坏分支,除非他们使用 git pull --rebase,否则这些开发人员将会得到损坏的或不一致的仓库。
- 你的开发团队技术是否足够娴熟?变基是一种破坏性操作。这意味着,如果你没有正确使用它,你可能会丢失提交,并且/或者会破坏其他开发者仓库的一致性。
- 分支本身是否代表有用的信息?一些团队使用功能分支(branch-per-feature)模式,每个分支代表一个功能(或错误修复,或子功能等)。在此模式中,分支有助于识别相关提交的集合。在每个开发人员分支(branch-per-developer)模式中,分支本身不会传达任何其他信息(提交信息已有作者)。则在这种模式下,变基不会有任何破坏。
- 是否无论如何都要还原合并?恢复(如在撤销中)变基,是相当困难的,并且/或者在变基中存在冲突时,是不可能完成的。如果你考虑到日后可能需要恢复,请使用合并操作。
六、标签
# 列出所有标签
git tag
# 新建一个tag在当前commit
git tag [tag]
# 新建一个tag在指定commit
git tag [tag] [commit]
# 查看tag信息
git show [tag]
# 提交指定tag
git push [remote] [tag]
# 提交所有tag
git push [remote] --tags
# 新建一个分支,指向某个tag
git checkout -b [branch] [tag]
七、查看信息
# 显示有变更的文件
git status
# 显示当前分支的版本历史
git log
# 显示commit历史,以及每次commit发生变更的文件
git log --stat
# 显示某个文件的版本历史,包括文件改名
git log --follow [file]
git whatchanged [file]
# 显示指定文件相关的每一次diff
git log -p [file]
# 显示指定文件是什么人在什么时间修改过
git blame [file]
# 显示暂存区和工作区的差异
git diff
# 显示暂存区和上一个commit的差异
git diff --cached [file]
# 显示工作区与当前分支最新commit之间的差异
git diff HEAD
# 显示两次提交之间的差异
git diff [first-branch]...[second-branch]
# 显示某次提交的元数据和内容变化
git show [commit]
# 显示某次提交发生变化的文件
git show --name-only [commit]
# 显示某次提交时,某个文件的内容
git show [commit]:[filename]
# 显示当前分支的最近几次提交
git reflog
- git diff——查看所有本地文件的改动。只改动一个文件的话可以在命令后添加文件名。
- git log——查看所有提交历史。还可用于带有 git log –p my_file 的文件,输入 q 退出。
- git blame my file——了解谁在什么时候对 my_file 做了什么样的改动。
- git reflog——显示本地代码库 HEAD 的更改日志。这个命令很适合查找丢失的工作。
查看提交信息日志
查看分支最近一次的修改列表:git status
- 查看分支的commit信息(倒叙排列)
git log
查看commit id, Author, Date, commit infogit shortlog
按提交者分类显示提交信息git log --oneline
只输出commit id 和 commit infogit log --stat
查看增删查改了哪些文件
八、远程同步
# 下载远程仓库的所有变动
git fetch [remote]
# 显示所有远程仓库
git remote -v
简短地查看当前配置有哪些远程仓库,如果我们想显示对应的远程地址,可以添加-v参数
# 显示某个远程仓库的信息
git remote show [remote]
# 增加一个新的远程仓库,并命名
git remote add [shortname] [url]
# 取回远程仓库的变化,并与本地分支合并
git pull [remote] [branch]
# 上传本地指定分支到远程仓库
git push [remote] [branch]
# 强行推送当前分支到远程仓库,即使有冲突
git push [remote] --force
# 推送所有分支到远程仓库
git push [remote] --all
“git pull”和“git fetch”之间有什么区别?
简单来说,git pull 是 git fetch + git merge。
- 当你使用 pull,Git 会试着自动为你完成工作。它是上下文(工作环境)敏感的,所以 Git 会把所有拉取的提交合并到你当前处理的分支中。pull 则是 自动合并提交而没有让你复查的过程。如果你没有细心管理你的分支,你可能会频繁遇到冲突。
- 当你 使用fetch,Git 会收集目标分支中的所有不存在的提交,并将这些提交存储到本地仓库中。但Git 不会把这些提交合并到当前分支中。这种处理逻辑在当你需要保持仓库更新,在更新文件时又希望处理可能中断的事情时,这将非常实用。而将提交合并到主分支中,则该使用 merge。
九、撤销
# 恢复暂存区的指定文件到工作区
git checkout [file]
# 恢复某个commit的指定文件到工作区
git checkout [commit] [file]
# 恢复上一个commit的所有文件到工作区
git checkout .
# 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
git reset [file]
# 重置暂存区与工作区,与上一次commit保持一致
git reset --hard
# 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
git reset [commit]
# 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
git reset --hard [commit]
git reset --hard xxxxxx 命令,这个强制恢复到某次提交慎用
git fsck --lost-found //找回git add过但是已经不存在文件中的内容
# 重置当前HEAD为指定commit,但保持暂存区和工作区不变
git reset --keep [commit]
如在 Git 恢复先前的提交?
假设你的情形是这样,其中 C 是你的 HEAD,(F) 是你文件的状态。
(F)
A-B-C
↑
master
要修改提交中的更改:
git reset --hard HEAD~1
现在 B 是 HEAD,因为你使用了 --hard,所以你的文件将重置到提交 B 时的状态。
要撤销提交但保留更改:
git reset HEAD~1
现在我们告诉 Git 将 HEAD 指针移回(后移)一个提交(B),并保留文件原样,然后你可以 git status 来显示你已经检入 C 的更改。
撤销提交但保留文件和索引:
git reset --soft HEAD~1
执行此操作后,git status,你讲看到索引中的文件跟以前一致。
# 新建一个commit,用来撤销指定commit
# 后者的所有变化都将被前者抵消,并且应用到当前分支
git revert [commit]
git checkout
命令用于切换分支或恢复工作树文件。checkout 最适合用于仅限于本地的撤销。它不会破坏你的协作伙伴所依赖的远程分支的提交历史。- git revert my commit——撤销 my_commit 中的更改。当用 revert 撤销改动时,它会产生新的提交。对协作项目而言,revert 是很安全的,因为它不会覆盖其他用户分支可能依赖的历史记录。
如何从 git 中删除文件,而不将其从文件系统中删除?
如果你在 git add 过程中误操作,你最终会添加不想提交的文件。但是,git rm 则会把你的文件从你暂存区(索引)和文件系统(工作树)中删除,这可能不是你想要的。
换成 git reset 操作:
git reset filename # or
echo filename >> .gitingore # add it to .gitignore to avoid re-adding it
上面意思是,git reset <paths> 是 git add <paths> 的逆操作。
十、其他
# 生成一个可供发布的压缩包
git archive
十一、Vim
使用 Git 时,你可能偶尔会发现自己被困在 Vim 会话中了。
例如,你试着在没有提交信息的情况下提交,Vim 会自动开启。
- 按 a, i 或 o 进入编辑模式
- 按 ESC 进入操作模式
- 在操作模式下,:wq 为写入退出,:q! 不保存退出
一、vim 有两种工作模式:
1.命令模式:接受、执行
vim
操作命令的模式,打开文件后的默认模式;2.编辑模式:对打开的文件内容进行 增、删、改 操作的模式;
3.在编辑模式下按下
ESC
键,回退到命令模式;在命令模式下按i,进入编辑模式
二、创建、打开文件:
1.输入 touch 文件名 ,可创建文件。
2.使用 vim 加文件路径(或文件名)的模式打开文件,如果文件存在则打开现有文件,如果文件不存在则新建文件。
3.键盘输入字母
i
进入插入编辑模式。
三、保存文件:
1.在编辑模式下编辑文件
2.按下
ESC
键,退出编辑模式,切换到命令模式。3.在命令模式下键入"
ZZ"
或者":wq"
保存修改并且退出vim
。4.如果只想保存文件,则键入"
:w"
,回车后底行会提示写入操作结果,并保持停留在命令模式。
四、放弃所有文件修改:
1.放弃所有文件修改:按下
ESC
键进入命令模式,键入":q!"
回车后放弃修改并退出vim
。2.放弃所有文件修改,但不退出
vi
,即回退到文件打开后最后一次保存操作的状态,继续进行文件操作:按下ESC
键进入命令模式,键入":e!"
,回车后回到命令模式。
五、查看文件内容:
在git窗口,输入命令:cat 文件名
六、创建文件夹
在git窗口,输入命令:touch 文件夹名
更改默认编辑器
为了避免使用 Vim,可以更改 Git 中的默认编辑器。以下是更改我使用的编辑器 Atom 的默认值的命令:
git config --global core.editor "atom --wait"
假设你已经安装了 Atom,你现在就可以在 Atom 中解决 Git 问题了。
十二、创建 Git 命令的快捷键
在 .bash_profile 中添加以下 alias 命令可以给 Git 命令添加快捷键:
1. alias gs='git status ' 2. alias ga='git add ' 3. alias gaa='git add -A ' 4. alias gb='git branch ' 5. alias gc='git commit ' 6. alias gcm='git commit -m ' 7. alias go='git checkout '
你可以调整上述命令,来为任何 Git 命令添加快捷键。
如果你没有 .bash_profile,你可以用以下命令在 macOS 上创建一个:
touch ~/.bash_profile
十三、配置.gitignore忽略文件
在项目中,对于图片,音乐等文件,我们想忽略它们而不纳入git管理,我们可以创建.gitignore文件,
对于.gitignore文件,编辑由一下几点需要注意:
1. 所有空行或者以注释符号 # 开头的行都会被 Git 忽略。
2. 可以使用标准的glob 模式匹配。
3. 匹配模式最后跟反斜杠( / )说明要忽略的是目录。
4. 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号( ! )取反
glob 模式是指 shell 所使用的简化了的正则表达式。
星号( * )匹配零个或多个任意字符;
[abc] 匹配 任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);
问号( ? ) 只匹配一个任意字符;
如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配
(比如 [0-9] 表示匹配所有 0 到 9 的数字)。
看一个 .gitignore 文件的例子:
\ # 此为注释 – 将被 Git 忽略
*.a # 忽略所有 .a 结尾的文件
!lib.a # 但 lib.a 除外
/TODO # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
build/ # 忽略 build/ 目录下的所有文件
doc/*.txt # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
参考来源:http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html