Git常用命令

Git工作流

image.png

常用命令

git status

可以查看各文件的状态和所处的分支

On branch master   #所处的分支
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
# 文件状态
(use "git reset HEAD <file>..." to unstage)
new file: README
modified: CONTRIBUTING.md

这样的信息过于繁琐,可以用git status -s显示简短信息

 M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt

最左边的两个字母,左边表示暂存区状态,右边表示工作区状态。

M:Modified A:Added ?:Untracked

git diff

git diff 比较工作目录中当前文件和暂存区域快照之间的差异

git diff --staged/git diff --cached比较暂存区和git仓库提交的最后一个版本的差别

可以使用git difftool调用GUI工具比较差异

git add

添加文件到暂存区

git add . 表示添加目录下所有文件,但是会忽略掉.gitignore里标注的文件,.处可以用glob匹配规则

git rm

git rm xxx 用于删除了工作区文件后,删除暂存区文件,并不跟踪

git rm -f xxx 表示删除暂存区xxx文件、工作区文件会被一起删除

git rm --cached xxx 表示删除暂存区xxx文件,工作区不会被删除【适用于想保留文件,但不想让git跟踪】

git mv

git mv xxx yyy 把名为xxx的文件名改为yyy【工作区文件会被修改】

相当于以下三条命令

git mv README.md README
============上下等价===========
mv README.md README
git rm README.md
git add README

git commit

git commit 进入设置的编辑器编辑提交的内容

git commit -m "xxxxx" 快速设置提交的内容为xxxxx

合并commit信息

git commit --amend 可以修改上一次的提交信息,会将暂存区的文件进行提交

如果需要修改上一次commit里的文件,可以这样操作

git commit -m "需要被修改的提交"

# 对上面那次提交做修改
git add .
git commit -m "新Message" --amend

git log

HEAD表示该分支上的最后一次提交的快照,后面的master表示所处的分支
image-20220721141559195
image-20220721141753010
这里的时间可以用2022-7-21也可以用2.weeks

git reset

取消暂存区的文件use "git reset HEAD ..." to unstage

git restore / git checkout –

撤销对文件的修改,恢复到最后一次提交的状态

远程仓库的使用

如工作流图所示,但是需要注意

  1. clone会带着版本历史和记录一起下载,直接在GitHub上下载的zip包没有

  2. pull命令会覆盖工作区文件,fetch不会【其对应的命令为git fetch/pull <remote>

  3. push命令为git push <remote> <branch>

查看远程仓库

git remote 列出每一个远程服务器的简写

git remote -v 会附带显示其url

添加远程仓库

git remote add <shortname> <url> 添加远程仓库

添加完远程仓库后,可以用shortname代表远程仓库

例如: 执行git remote add gitignore https://github.com/github/gitignore后,可以用gitignore/master访问其master分支

git clone 之后会默认设置远程仓库origin为克隆的地址

远程仓库的重命名与移除

git remote rename <old> <new> 重命名

git remote remove/rm <remote> 移除

Git别名

git config --global alias.<new> <old>

例如:执行了git config --global alias.ci 'commit'

之后git ci就等价于git commit

【git也可以代理非git命令】

git config --global alias.p '!ping' 【注意使用!

之后git pping等价

.gitignore文件

.gitignore文件采用glob模式进行匹配。【glob 模式是指 shell 所使用的简化了的正则表达式】

可以在根目录下有一个,子目录下也可以有

字符 匹配
* >=0个字符
? 1个字符
[abc] ([a-c])、[0-9] 一个其中的任意一个字符
** 任意中间目录

一个示例:

# 忽略所有的 .a 文件
*.a
# 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件
!lib.a
# 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO
/TODO
# 忽略任何目录下名为 build 的文件夹
build/
# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
doc/**/*.pdf

Github提供了常用的.gitignore文件:

github/gitignore: A collection of useful .gitignore templates