# 1.设置全局的用户名和邮箱属性
```
git config --global user.name "xxx"
git config --global user.email "xxx@163.com"
```
## 1.1.设置文本编辑器
```
git config --global core.editor "'E:\Program Files (x86)\EditPlus\EditPlus\EditPlus\EditPlus.exe'"
```
# 2.查看配置信息
```
git config --list
```
## 2.1.查看某个属性值
```
git config remote.origin.url
```
# 3.获取帮助
```
git help <verb>
git <verb> --help
man git-<verb>
```
# 4.获取git仓库
## 4.1.初始化git仓库
```
git init
```
## 4.2.克隆git仓库
```
git clone <remoteUrl>
```
# 5.查看当前文件处于的状态
```
git status
```
如果你使用 git status -s 命令或 git status --short 命令,你将得到一种格式更为紧凑的输出。
## 5.1.Untracked files
这种情况出现在新建几个文件(版本中不存在的),但是没有提交到暂存区的的时候
## 5.2.Changes not staged for commit
这种情况出现在版本已有文件遭到修改但是还没提交到暂存区的时候
## 5.3.Changes to be committed
这种情况出现在提交到暂存区之后的时候
# 6.跟踪新文件或将已跟踪文件修改后, 放入暂存区
```
git add ... -> 将指定文件添加到暂存区
git add * -> 所有文件添加到暂存区
```
# 7.查看已暂存和未暂存的修改
```
git diff -> 此命令比较的是工作目录中当前文件和暂存区域快照之间的差异
git diff --staged | git diff --cached -> 这条命令将比对已暂存文件与最后一次提交的文件差异
git difftool -> 调用 emerge 或 vimdiff 等软件(包括商业软件)输出 diff 的分析结果, 比较工作目录中当前文件和暂存区域快照之间的差异
git difftool --cached(staged) -> 调用 emerge 或 vimdiff 等软件(包括商业软件)输出 diff 的分析结果, 比较已暂存文件与最后一次提交的文件差异
```
# 8.版本回退
```
git reflog -> 查看版本号
git reset --hard <版本号> -> 回退到版本号指定得
```
# 9.提交更新
```
git commit
git commit -m "提交信息说明" -> 将提交信息与提交命令放在同一行
git commit -a -> Git 就会自动把所有已经跟踪过的文件暂存起来一并提交, 从而跳过 git add
git commit -a -m "xxx" -> 不需要先执行git add添加文件到暂存区, 直接提交和添加暂存一起执行
```
# 10.撤消操作
git commit --amend -> 如果上次提交以来未做任何修改(例如,在上次提交后马上执行了此命令),快照会保持不变,而修改的只是提交信息。
示例1: 本次commit提交之后发现提交信息写错了, 执行命令如下, 前提是提交之后没做任何修改
```
git commit --amend
```
示例2: 本次提交之后发现有文件漏了暂存并提交, 执行如下命令:
```
git add ** -> 先暂存文件
git commit --amend -> 可以改也可以不该提交信息, 然后保存即可, 此文件就在之前的提交中了, 而且没有多余的其他提交记录
```
# 11.移除文件
```
git rm -> 从已跟踪文件清单中移除(确切地说,是从暂存区域移除), 并连带从工作目录中删除指定的文件
git rm -f -> 如果要删除之前修改过或已经放到暂存区的文件,则必须使用强制删除选项 -f(译注:即 force 的首字母)
git rm --cached xxx -> 想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中
git rm log/\*.log -> 列出文件或者目录的名字, 此命令删除 log/ 目录下扩展名为 .log 的所有文件
git rm \*~ -> 该命令会删除所有名字以 ~ 结尾的文件。
```
# 12.移动文件
```
git mv file_from file_to -> 要在 Git 中对文件改名
```
# 13.查看提交历史 和 限制输出长度
```
git log -> 按时间先后顺序列出所有的提交,最近的更新排在最上面
git log --patch | git log -p -> 会显示每次提交所引入的差异
git log -n -> 只显示最近的n次提交
git log --stat -> 显示每次提交的简略统计信息(文件修改统计信息)
git log pretty=oneline(short|full|fuller) -> 可以使用不同于默认格式的方式展示提交历史, =选项不同详尽程度不一
git log pretty=format:"%h ..." -> 定制记录的显示格式, ""中的内容就是格式, 具体百度
git log --since=2.weeks -> 列出最近两周的所有提交
git log --since(after) -> 仅显示指定时间之后的提交
git log --until(before) -> 仅显示指定时间之前的提交
git log --author -> 仅显示作者匹配指定字符串的提交
git log --committer -> 仅显示提交者匹配指定字符串的提交
git log --grep -> 仅显示提交说明中包含指定字符串的提交
git log -S -> 仅显示添加或删除内容匹配指定字符串的提交
```
# 14.取消暂存或工作空间的文件
示例1: 修改了两个被追踪的文件, 执行了git add * 暂存了两个文件, 但是想分别作为两个独立的文件进行两次提交, 如何取消其中一个文件的暂存呢?
其实git status命令就已经给出了提示,git status之后会发现有一个提示命令: use "git restore --staged <file>..." to unstage。
所以执行命令如下,就可以取消暂存,回到未暂存的状态
```
git restore --staged <file>...
```
示例2: 修改了文件, 但是还没有暂存, 不想保留想要撤回修改, 将它还原成上次提交时的样子。
其实git status 也已经给出了提示,git status之后会发现提示命令: use "git restore <file>..." to discard changes in working directory。
所以执行命令如下,就可以撤销修改了
```
git restore <file>
```
# 15.查看远程仓库
```
git remote -> 如果想查看已经配置的远程仓库服务器可执行此命令, 会列出你指定的每一个远程服务器的简写,如果已经克隆了仓库,那么至少应该能看到 origin(Git给克隆的仓库服务器的默认名字)
git remote -v -> 会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL
```
# 16.添加远程仓库
git clone 命令可以自行添加远程仓库的, 但是这里是自己来添加, 命令:git remote add <shortname> <url> 添加一个新的远程 Git 仓库,同时指定简写(类似origin)
示例1: git remote add demo-git https://github.com/xxx/demo-git.git
现在你可以在命令行中使用字符串 demo-git 来代替整个 URL。如果你想拉取仓库中有但你没有的信息,可以运行 git fetch demo-git
# 17.从远程仓库中抓取与拉取
git fetch <remote> -> 从远程仓库中获得数据,会访问远程仓库,从中拉取所有你还没有的数据。 执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看
如果你使用 clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写。
所以,git fetch origin 会抓取克隆(或上一次抓取)后新推送的所有工作。
必须注意 git fetch 命令只会将数据下载到你的本地仓库——它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。
# 18.推送到远程仓库
```
git push <remote> <branch> -> 分享你的项目时,必须将其推送到上游。
```
```
git push -u origin master -> 将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了
git push origin master -> 把本地master分支的最新修改推送到origin对应github上了, 只有当你有所克隆服务器的写入权限,并且之前没有人推送过时,这条命令才能生效, 否则被拒绝, 必须先拉取他人的推送合并
git push origin -> 将当前分支推送到origin主机的对应分支, 如果当前分支只有一个追踪分支,那么主机名都可以省略。
```
# 19.查看某个远程仓库
git remote show <remote>, 查看某一个远程仓库的更多信息, 会列出远程仓库的 URL 与跟踪分支的信息,它告诉你正处于什么分支
```
git remote show origin -> 查看远程仓库origin的信息
```
# 20.远程仓库的重命名与移除
git remote rename oldname newname -> 修改一个远程仓库的简写名
```
git remote rename demo-git git -> 将之前远程仓库名的简写从demo-git改为git
git remote remove demo-git 或 git remote rm demo-git -> 想要移除一个远程仓库demo-git
```
# 21.打标签
## 21.1.列出标签
```
git tag (可带上可选的 -l 选项 --list) -> 在 Git 中列出已有的标签
git tag -l "v1.8.5*" -> 只查询1.8.5系列的标签(按照通配符列出标签需要 -l 或 --list 选项)
```
## 21.2.创建标签
Git 支持两种标签:轻量标签(lightweight)与附注标签(annotated)
- 轻量标签很像一个不会改变的分支——它只是某个特定提交的引用。
- 而附注标签是存储在 Git 数据库中的一个完整对象, 它们是可以被校验的,其中包含打标签者的名字、电子邮件地址、日期时间, 此外还有一个标签信息,并且可以使用 GNU Privacy Guard(GPG)签名并验证。 通常会建议创建附注标签,这样你可以拥有以上所有信息。但是如果你只是想用一个临时的标签,或者因为某些原因不想要保存这些信息,那么也可以用轻量标签。
附注标签:
```
git tag -a v1.4 -m "my version 1.4" -> -m 选项指定了一条将会存储在标签中的信息。 如果没有为附注标签指定一条信息,Git 会启动编辑器要求你输入信息。
git show 命令可以看到标签信息和与之对应的提交信息
```
轻量标签, 不需要使用 -a、-s 或 -m 选项,只需要提供标签名字
```
git tag v1.4
git show 命令可以看到标签信息和与之对应的提交信息
```
## 21.3.后期打标签
也可以对过去的提交打标签。要在那个提交上打标签,你需要在命令的末尾指定提交的校验和(或部分校验和, git log可以查询):
例如:
```
git tag -a v1.2 9fceb02
```
```
git show 可以查看
```
## 21.4.共享标签
默认情况下,git push 命令并不会传送标签到远程仓库服务器上。在创建完标签后你必须显式地推送标签到共享服务器上。
```
git push origin <tagname> -> 推送某个标签
git push origin --tags -> 要一次性推送很多标签
```
## 21.5.删除标签
```
git tag -d <tagname> -> 删除掉你本地仓库上的标签, 并不会从任何远程仓库中移除这个标签
git push <remote> :refs/tags/<tagname> -> 从任何远程仓库中移除这个标签, 含义是,将冒号前面的空值推送到远程标签名,从而高效地删除它
git push origin --delete <tagname> -> 更直观的删除远程标签的方式
```
## 21.6.检出标签
```
git checkout
```
# 22.Git别名
可以通过 gitconfig 文件来轻松地为每一个命令设置一个别名, 如下:
```
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
```
例如 git config --global alias.ci commit,意味着,当要输入 git commit 时,只需要输入 git ci
# 23.stash
```
git stash -> 将当前分支的工作隐藏起来, 就可以已切换分支了
git stash list -> 查看当前隐藏的工作
```
恢复stash:
```
git stash apply -> 恢复, 回复之后还需要使用命令git stash drop来删除
git stash pop -> 恢复的同时把stash内容也删除了
```
# 24.拉取
```
git pull
```
如果失败:
```
git branch --set-upstream-to=dgit/<branch> test -> 绑定远程test和本地分支<branch>, 然后就可以pull了
```
# 25.查看分支
```
git branch
```
# 26.分支创建
```
git branch <name> -> 创建分支, 指定名字
```
# 27.分支切换
```
git checkout <name> -> 切换到name的分支
```
# 28.创建新分支的同时切换过去
```
git checkout -b <newbranchname>
```
# 29.删除分支
```
git branch -d <name> -> 删除本地分支
git push dgit -d <name> -> 删除远程分支
```
# 30.分支的新建与合并
```
git merge <branchname> -> 将branchname的分支合并到当前分支
```
# 31.遇到冲突时的分支合并
如果你想使用图形化工具来解决冲突,你可以运行 git mergetool
# 32.分支管理
git branch 命令不只是可以创建与删除分支。 如果不加任何参数运行它,会得到当前所有分支的一个列表
```
git branch -v -> 查看每一个分支的最后一次提交
```
# 33.远程分支
```
git remote show <remote> -> 获得远程分支的更多信息
```
# 34.推送分支
```
git branch <name> -> 先创建
git push dgit <name> -> 推送
```
# Git撤销和回滚
- 工作区:即自己当前分支所修改的代码,git add xx 之前的!不包括 git add xx 和 git commit xxx 之后的
- 暂存区:已经 git add xxx 进去,且未 git commit xxx 的。
- 本地分支:已经git commit -m xxx 提交到本地分支的。
## 1.1、在工作区的代码
```
git checkout -- a.txt # 丢弃某个文件,或者
git checkout -- . # 丢弃全部
```
注意:git checkout – . 丢弃全部,也包括:新增的文件会被删除、删除的文件会恢复回来、修改的文件会回去。这几个前提都说的是,回到暂存区之前的样子。对之前保存在暂存区里的代码不会有任何影响。对commit提交到本地分支的代码就更没影响了。当然,如果你之前压根都没有暂存或commit,那就是回到你上次pull下来的样子了。
## 1.2、代码git add到缓存区,并未commit提交
```
git reset HEAD . 或者
git reset HEAD a.txt
```
这个命令仅改变暂存区,并不改变工作区,这意味着在无任何其他操作的情况下,工作区中的实际文件同该命令运行之前无任何变化
## 1.3、git commit到本地分支、但没有git push到远程
```
git log # 得到你需要回退一次提交的commit id
git reset --hard <commit_id> # 回到其中你想要的某个版
或者
git reset --hard HEAD^ # 回到最新的一次提交
或者
git reset HEAD^ # 此时代码保留,回到 git add 之前
```
## 1.4、git push把修改提交到远程仓库
通过git reset是直接删除指定的commit
```
git log # 得到你需要回退一次提交的commit id
git reset --hard <commit_id>
git push origin HEAD --force # 强制提交一次,之前错误的提交就从远程仓库删除
```