Git常用命令速查
本文简单介绍了Git本地仓库的构建,与远程仓库的关联。
安装Git #
ubuntu下安装:
1sudo apt install git
windows 下安装,需 下载安装包
Git 本地仓库的创建 #
通俗地讲,本地任何一个目录都可以是本地仓库。只需要启动Terminal(ubuntu)或Git Bash(windows),cd
进入指定目录,运行
1git init
即可以初始化一个空的本地仓库。此时,该目录下会多出一个.git
子目录,它是Git用来跟踪管理版本库的。当然,如果你想取消版本管理,删除这个目录即可。
Git 不同于 Subversion 的地方在于,Git是分布式的版本管理系统,没有中央服务器。这大概解释了Git可以创建本地仓库的原因,而Subversion的使用必须要借助互联网。
关于集中式与分布式的讨论,此处不作多的说明,没有使用经验支撑,那些优劣列出来,没有什么意义。
Git 关联GitHub远程仓库 #
Git支持基于SSH和https关联远程仓库,但推荐使用SSH方式,它更加安全。在本地仓库要想和GitHub远程仓库关联,首先需要在GitHub中配置SSH and GPG keys。
通过
1ssh-keygen -t rsa -C "wangy325@qq.com"
获取ssh密钥文件,操作过程中会提示确认保存文件的位置以及要求输入密码,以下是命令输出(windows 平台)。
1Generating public/private rsa key pair.
2Enter file in which to save the key (/c/Users/mayn/.ssh/id_rsa):
3Enter passphrase (empty for no passphrase):
4Enter same passphrase again:
5Your identification has been saved in /c/Users/mayn/.ssh/id_rsa.
6Your public key has been saved in /c/Users/mayn/.ssh/id_rsa.pub.
7The key fingerprint is:
8SHA256:Yy7sS0KnY+iaQDLldwI43znocIboZhDbD5ZPwjzMybU wangy325@qq.com
9The key's randomart image is:
10+---[RSA 2048]----+
11| |
12| . |
13|+ o . |
14|./ B o |
15|O.^ E o S |
16|=B @ B o . |
17|.+o B + . |
18|+o . = . |
19|o.. o. |
20+----[SHA256]-----+
命令执行完成之后,会在 c/Users/mayn/
下生成一个.ssh
目录,里面包含了密钥信息。
然后在GitHub页面添加新的ssh key,配置完成以后,便可以将本地仓库和远程仓库关联,并将本地文件上传到远程(通常,你需要先add
并且commit
文件到本地版本库):
1git remote add origin git@github.com:wangy325/repositoryName.git
2git push -u origin master
Git的工作模式简单介绍 #
- 工作区(workspace):即当前工作目录
- 暂存区(stage/index):
.log
目录下的的index文件中,暂存区域保存的是本地已add
但未commit
的改动 - 版本库(local repository):本地版本库,
commit
之后文件信息变保存在其中 - 远程仓库(remote repository):远程版本库,
push
推送本地文件到远程版本库,fetch
从远程版本库拉取资源版本信息,pull
从远程版本库中拉取资源
Git本地工作区,暂存区,版本库的概念,图引自 易百教程
Git 版本控制的一些主要概念:
- 3个步骤:
add
命令只添加文件到暂存区commit
命令将文件添加到本地版本库push
命令将本地版本库的内容推送到远程仓库
- 4个区:
- workingAera:当前工作空间
- stage:暂存区,已修改并
add
的文件在此区 - local repository:本地仓库
- remote repository:远程仓库
- 5种状态
- origin:被git追踪但未作任何修改
- modified:已修改但未
add
到暂存区 - staged:已修改并
add
到暂存区 - committed:已提交到本地仓库
- pushed:已推送到远程仓库
常用命令 #
git command --help 可以打开帮助文档
git config --global credential.helper store 保存用户凭证,避免每次push/pull都需要输入密码
添加文件到暂存区 #
1git add file1 ...
提交文件到仓库之前,需要配置用户名和电子邮件
1git config --global user.name "wangy325"
2git config --global user.email "wangy325@qq.com"
提交文件到仓库 #
1git commit -m "commit comment"
查看当前仓库的状态 #
1$ git status
2On branch master
3Your branch is up to date with 'origin/master'.
4
5Changes not staged for commit:
6 (use "git add <file>..." to update what will be committed)
7 (use "git checkout -- <file>..." to discard changes in working directory)
8
9 modified: readme.md
10
11Untracked files:
12 (use "git add <file>..." to include in what will be committed)
13
14 Main.java
15
16no changes added to commit (use "git add" and/or "git commit -a")
查看某个文件的差异信息 #
git diff
查看暂未`add`到暂存区的改动,也就是状态为`modified`的文件,
如果文件已经`staged`,则此命令不会显示差异信息
git diff --cached
查看已经`add`到暂存区的改动,也就是状态为`staged`的文件,
如果文件处于`modified`状态,则此命令不会显示差异信息
git diff HEAD
查看已暂存和未暂存的所有改动
git diff --stat
显示差异的摘要信息
git diff master origin/master
显示本地仓库和远程仓库之间的文件的差异信息,即`committed`和`pushed`两个状态之间的差异
git diff versionCode1 versionCode2
显示两个版本(号)之间的差异信息,`less`打开
1$ git diff readme.md
2warning: LF will be replaced by CRLF in readme.md.
3The file will have its original line endings in your working directory.
4diff --git a/readme.md b/readme.md
5index bb8298f..222e2da 100644
6--- a/readme.md
7+++ b/readme.md
8@@ -6,3 +6,5 @@
9 - Java的回调机制
10 - idea的多线程调试
11 - 拦截器
12+
13+> you can't live your life based on other people's point of view.
查看提交日志 #
git log [<options>] [<revision-range>] [[--] <path>...]
1$ git log
2commit cf3d291b043457536f5851c3517c94f6f50d4c94 (HEAD -> master, origin/master)
3Author: wangy325 <wangy325@qq.com>
4Date: Wed Sep 19 12:11:13 2018 +0800
5
6 update readme.md
7...
上面的日志显示 HEAD 的版本号为cf3d291b043457536f5851c3517c94f6f50d4c94
,括号内显示,本地仓库和远程仓库的文件是一致的(最新的),以下是commit但是没有push到远程仓库的日志记录:
1commit f67ec47c9df0f0f8351413ef64494e908d7183a0 (HEAD -> master)
2Author: wangy325 <wangy325@qq.com>
3Date: Thu Sep 20 17:29:09 2018 +0800
4
5 add motto
6
7commit cf3d291b043457536f5851c3517c94f6f50d4c94 (origin/master)
8...
上面的日志显示,本地HEAD最新的版本号和远程仓库的版本号不一致,暗示本地仓库的改动还未提交到远程仓库。
由于可视化工具的强大,现在很少直接使用git log
命令来查看提交日志,如果想查看,可以使用如下常用命令:
git log --oneline 仅展示hash和提交信息
git log --pretty=format:"%h - %an, %ar : %s" 按格式展示提交信息
git log --pretty=:"%h: %an %s" --graph 按格式展示提交信息,--graph表示合并信息
git log --oneline --decorate --graph --all 展示提交历史,分支指向及分支分叉情况
撤销修改 #
如果使用命令行操作Git,往往能够得到不错的操作提示。Git的有几种方式支持撤消操作,分别对应不同的使用情景。
漏提交了几个文件
有时候,我们可能不小心,漏提交了几个文件,或者提交信息写错了,可以使用
--amend
来挽回〔损失〕。git commit --amend
这时候,Git会弹出一个Vim操作界面,让你修改提交信息。
取消暂存的文件
更多时候,可能由于“手滑”,需要取消添加到暂存区的文件,这个时候,就需要
git restore
命令了。git restore --staged <file> ...
git restore
还有个不带--storage
参数的版本,用来恢复对工作区未暂存文件的修改:git restore <file>...
这个操作要谨慎,对于Git来说,未提交的修改,一旦撤消,就不可恢复。而已经提交的修改,都是可以恢复的。
此外,
get reset
命令也可以完成同样的操作:git reset HEAD <file>
git reset
命令很强大,使用要谨慎。丢弃已经提交的修改
要撤消对文件的修改,将其恢复成为修改前的样子,方法就是使用
git restore
命令。此外,还可以使用git checkout
命令。一般认为,
git checkout
用来切换分支。git checkout -- <file>...
同样地,
checkout
也是一个⚠️危险的命令。
从工作区和索引中删除文件 #
git rm [-f|--force][-n][-r][--cached][--ignore-unmatch][--quiet][--] <file>…
1 git rm <file>
从当前工作目录中删除文件,这个文件将会从工作空间物理删除,然后commit,版本库中的改文件信息会被删除
1$ git rm text2.md
2rm 'text2.md'
3
4$ git status
5On branch master
6Your branch is ahead of 'origin/master' by 5 commits.
7 (use "git push" to publish your local commits)
8
9Changes to be committed:
10 (use "git reset HEAD <file>..." to unstage)
11
12 deleted: text2.md
13
14$ git commit -m "aaa"
15[master d0ba06d] aaa
16 1 file changed, 1 deletion(-)
17 delete mode 100644 text2.md
2 git rm -f <file>
如果当前文件已经在暂存区,则将其从暂存区和工作空间中移除(移除版本信息),commit 之后,其将不在版本库中
1$ git add t3.md
2warning: LF will be replaced by CRLF in t3.md.
3The file will have its original line endings in your working directory.
4
5$ git rm t3.md
6error: the following file has changes staged in the index:
7 t3.md
8(use --cached to keep the file, or -f to force removal)
9
10$ git rm -f t3.md
11rm 't3.md'
12
13$ git status
14On branch master
15Your branch is ahead of 'origin/master' by 6 commits.
16 (use "git push" to publish your local commits)
17
18nothing to commit, working tree clean
3 git rm --cached <file>
如果当前文件改动已经add到暂存区,使用该命令从暂存区中移除版本信息,但是工作空间中还存在,commit之后,其将不在版本库中
1$ git add t3.md
2warning: LF will be replaced by CRLF in t3.md.
3The file will have its original line endings in your working directory.
4
5$ git rm --cached t3.md
6rm 't3.md'
7
8$ ls
9me/ readme.md t3.md
10
11$ git status
12On branch master
13Your branch is ahead of 'origin/master' by 7 commits.
14 (use "git push" to publish your local commits)
15
16Changes to be committed:
17 (use "git reset HEAD <file>..." to unstage)
18
19 deleted: t3.md
20
21Untracked files:
22 (use "git add <file>..." to include in what will be committed)
23
24 t3.md