安装后配置
$ git config --global user.name 'Your Name'
$ git config --global user.email 'email@example.com'
创建 GIT 仓库
$ git init
将文件添加到仓库
$ git add reame.txt
强制添加忽略文件
$ git add -f thumbnail_100X100.jpg
将文件提交到仓库
$ git commit -m 'readme.txt
补充:-m参数后输入本次提交的备注
查看仓库状态
$ git status
# 位于分支 master
# 尚未暂存以备提交的变更:
# (使用 "git add <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 修改: readme.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
查看修改内容
$ git diff
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
Git is free software.
# 查看工作区和版本库的区别
$ git diff HEAD -- readme.txt
diff --git a/readme.txt b/readme.txt
index 0d0c611..f688d0e 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,4 +1,4 @@
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index call stage.
-Git tracks changes.
+Git tracks changes of files.
查看历史记录
$ git log
commit eb62f41107873633bba865bc25080f69f376fa83
Author: dust <1036605035@qq.com>
Date: Sun May 19 16:09:25 2019 +0800
append GPL
commit 7807e3424a4f1a253b45329475e6633a63b7b039
Author: dust <1036605035@qq.com>
Date: Sun May 19 16:07:28 2019 +0800
add distributed
commit e4343ddd14c7daddcc7fc60557065af82cc104fa
Author: dust <1036605035@qq.com>
Date: Sun May 19 15:47:25 2019 +0800
wrote a readme.txt
$ git log --pretty=oneline
eb62f41107873633bba865bc25080f69f376fa83 append GPL
7807e3424a4f1a253b45329475e6633a63b7b039 add distributed
e4343ddd14c7daddcc7fc60557065af82cc104fa wrote a readme.txt
# 查看分支合并图
$ git log --graph
# 查看分支合并情况
$ git log --graph --pretty=oneline --abbrev-commit
补充:–pretty=oneline 简化信息,只显示版本号和备注信息
版本回退
$ git reset --hard HEAD ^
HEAD 现在位于 7807e34 add distributed
# 版本回退后
$ git log --pretty=oneline
7807e3424a4f1a253b45329475e6633a63b7b039 add distributed
e4343ddd14c7daddcc7fc60557065af82cc104fa wrote a readme.txt
# 使用版本号回退到 append GPL
$ git reset --hard eb62f
$ git log --pretty=oneline
eb62f41107873633bba865bc25080f69f376fa83 append GPL
7807e3424a4f1a253b45329475e6633a63b7b039 add distributed
e4343ddd14c7daddcc7fc60557065af82cc104fa wrote a readme.txt
补充:HEAD 表示当前版本,上一个版本是 HEAD^,上上一个版本是 HEAD^^,上100个版本可以用 HEAD~100 表示
查看历史命令
$ git reflog
eb62f41 HEAD@{0}: reset: moving to eb62f
7807e34 HEAD@{1}: reset: moving to HEAD^
eb62f41 HEAD@{2}: commit: append GPL
7807e34 HEAD@{3}: commit: add distributed
e4343dd HEAD@{4}: commit (initial): wrote a readme.txt
撤销修改(未提交到缓存区)
$ git checkout -- readme.txt
补充:git checkout – file 中的 – 很重要,没有 – ,就变成了 ‘切换到另一个分支’ 的命令
撤销修改(已提交到缓存区)
$ git reset HEAD readme.txt
重置后撤出暂存区的变更:
M readme.txt
$ git status
# 位于分支 master
# 尚未暂存以备提交的变更:
# (使用 "git add <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 修改: readme.txt
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
$ git checkout -- readme.txt
$ git status
# 位于分支 master
无文件要提交,干净的工作区
删除文件
$ git rm file
生成SSH Key
$ ssh-keygen -t rsa -C 'youremail@example.com'
补充:查看用户主目录,如果没有 .ssh 目录,则用上面命令生成,将公钥添加到 GitHub 中
本地仓库和远程仓库关联
ssh 协议
$ git remote add origin git@github.com:dust-github/dustgit.git
$ vgit push -u origin master (第一次提交:后面使用 git push origin master 命令)
Warning: Permanently added the RSA host key for IP address '52.74.223.119' to the list of known hosts.
Counting objects: 25, done.
Compressing objects: 100% (20/20), done.
Writing objects: 100% (25/25), 2.05 KiB | 0 bytes/s, done.
Total 25 (delta 6), reused 0 (delta 0)
remote: Resolving deltas: 100% (6/6), done.
To git@github.com:dust-github/dustgit.git
* [new branch] master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。
https 协议
$ git remote add origin https://github.com/dust-github/dustgit.git
$ git push -u origin master (第一次提交:后面使用 git push origin master 命令)
Counting objects: 25, done.
Compressing objects: 100% (20/20), done.
Writing objects: 100% (25/25), 2.05 KiB | 0 bytes/s, done.
Total 25 (delta 6), reused 0 (delta 0)
remote: Resolving deltas: 100% (6/6), done.
To https://github.com/dust-github/dustgit.git
* [new branch] master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。
克隆远程仓库
ssh 协议
$ git clone https://github.com/dust-github/gitskills.git
https 协议
$ git clone git@github.com:dust-github/gitskills.git
创建分支
$ git branch <name>
切换分支
$ git checkout <name>
创建+切换分支
$ git checkout -b dev
# -b 参数表示创建并切换分支,相当于一下两条命令
$ git branch dev
$ git checkout dev
查看当前分支
$ git branch
* dev
master
# git branch 命令会列出所有分支,当前分支前面标有一个 * 号
查看分支所有提交文件
$ git ls-tree -r master
合并分支
$ git merge dev
更新 198cc11..91aceb0
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
# git merge 命令用于合并指定分支到当前分支
$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.
readme.txt | 1 +
1 file changed, 1 insertion(+)
# --no-ff 参数,表示禁用 Fast forward,Fast forward 为 Git 默认合并方式
删除分支
$ git branch -d dev
已删除分支 dev(曾为 91aceb0)。
# 查看分支,只剩下 master
$ git branch
* master
# 删除没有合并的分支
$ git branch -D <name>
储藏
# 创建隐藏
$ git stash
# 隐藏列表
$ git stash list
# 恢复隐藏
$ git stash apply
# 指定版本恢复
$ git stash apply stash@{0}
# 恢复并删除隐藏
$ git stash pop
查看远程库的信息
$ git remote
origin
# 更详细的信息
$ git remote -v
origin git@github.com:dust-github/dustgit.git (fetch)
origin git@github.com:dust-github/dustgit.git (push)
创建远程分支
$ git checkout -b branch-name origin/branch-name
指定本地分支和远程分支关联
$ git branch --set-upstream-to origin/<branch-name> <branch-name>
$ git branch --set-upstream-to=origin/<branch> <branch-name>
本地抓取分支
$ git pull
本地推送分支
$ git push origin branch-name
本地提交未push的历史整理为直线
$ git rebase
创建标签
$ git tag v1.0
为之前已提交的记录打标签
$ git tag v1.0 3dbe56c
创建带有说明的标签,用-a
指定标签名,-m
指定说明文字
$ git tag -a v0.1 -m "version 0.1 released" 3dbe56c
查看标签列表
$ git tag
查看标签
$ git show 3dbe56c
删除标签
$ git tag -d v0.1
推送标签
$ git push origin v1.0
推送所有标签
$ git push origin --tags
删除远程标签
$ git push origin :refs/tags/v1.0
检测忽略文件语法
$ git check-ignore
清除未跟踪文件
# 查看将要被删除的文件
$ git clean -n
# 删除当前目录下未跟踪文件,但是不会删除.gitignore文件指定的文件
$ git clean -f
# 删除当前目录下或者其后代目录下未跟踪的文件
$ git clean -df
# 删除当前目录下所有的文件,无论是否在.gitignore文件指定
$ git clean -xf
GIT 配置
$ git config --global color.ui true
$ git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"