#### 0.初始化
git config --global user.name 'xxx'
git config --global user.email 'xxx'
\#不让git自动换行:
git config --global core.autocrlf false
\#显示配置:
git config --list
#### 1.配置文件
git config --list --show-origin:查看当前配置文件
- /etc/gitconfig:所有用户的全局配置,可以直接加‘--system’来配置。
- ~/.gitconfig 或 ~/.config/git/config:当前用户的全局配置。可以直接加‘--global’来配置。
- 仓库/.git/config:当前仓库的配置,默认为这个。可以直接加‘--local’来配置。
#### 2.初始化
git init:将当前目录初始化为一个本地仓库
#### 3.git状态与命令
基本状态
git status:文件状态。‘-s’或‘--short’输入简短状态。
git add:追踪文件或提交到暂存区。
git diff:默认对比工作区的文件与暂存区的文件的差异。'--cache'或'--staged'对比暂存区与本地仓库的差异。
git commit:提交暂存区文件到本地仓库。'-a'将全部已追踪过的文件都提交。
git rm:删除文件并取消追踪,操作自动记录到暂存区。如果只是普通删除,则属于已修改状态。需要删除已修改或位于暂存区的文件,需要加'-f'。仅仅需要取消追踪,加'--cached'。
git mv:改名或移动。相当于'mv s t'+'git rm s'+'git add t'
#### .gitignore
所有空行或者以 # 开头的行都会被 Git 忽略。
可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
匹配模式可以以(/)开头防止递归。
匹配模式可以以(/)结尾指定目录。
要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。
case:
```
# 忽略所有的 .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
```
#### 撤销操作
**1.撤销工作区的修改**
git checkout [file]:撤销全部,则用'git checkout .'。
**2.撤销暂存区的修改**
git reset [file]:不加file,则撤销全部。
**3.撤销已提交**
git commit --amand:将暂存区文件提交到上次的commit。
git reset <hash>:回退到某次提交。
#### 远程仓库
git remote:'-v'查看详细信息。
git remote add <name> <url>:添加远程仓库
git fetch <name>:将远程仓库内容拉到本地仓库
git pull <name>:将远程仓库内容拉取并合并到当前分支
git remote rename <old> <new>:更改远程仓库的本地别名
git remote remove <name>:移除远程仓库
git remote show :显示远程标签
#### 标签
分为轻量标签与附注标签。前者只是表示一个提交的引用,后者会保存当前全部数据。
git tag:列出标签。
- -l [tagName]:列出指定标签。如[git tag -l "v1.8.*"],列出以"v1.8."开头的全部标签
- -a [tagName] [-m msg] [commitHash]:添加附注标签,需要描述内容。不加-a则创建轻量标签,不需要描述。后接提交hash时,表示为某次提交添加标签
git show [tagName]:显示标签的详细信息。
git push origin <tagName>:提交标签。默认情况下标签是不会提交的。--tags表示将全部未提交标签都提交。
git tag -d <tagname>:删除标签。或者:git push origin :refs/tags/<tagName>
git checkout <tagName>:移动到指定标签。注意不能提交修改。想要在这个版本的基础上修改,可以创建新分支:git branch -b <newBranch> <tagName>
#### 别名
case:
git config --global alias.co checkout
git config --global alias.unstage 'reset HEAD --'
#### 分支
git的分支本质上是HEAD指针在提交文件系统的位置。
git checkout <name>:切换分支。即将HEAD指针指向其他分支。
git branch <name>:新建分支。即创建一个分支指针指向当前所在的提交文件系统。-b则立刻切换过去。
- -d <name>:删除本地分支。
git diff <branch> <branch> <file>:比较分支的文件
git log:提交历史
-p:详细信息。
-n:n为数字,表示最后几次提交。
--graph:树的形式展示提交。加--all可以展示全部分支的提交。
#### 分支合并:
1.git merge <targetBrance>:两个分支是否直系关系,是则直接将HEAD移动到后代分支。否则如果没有冲突,根据两者共同祖先创建新提交节点,并将HEAD移动过去,否则2
2.处理冲突:以共同最小祖先为基础预构建合成节点
3.git add <冲突文件>:这一步告诉git冲突处理完成
4.git commit:生成新节点
#### 远程分支
几个概念需要注意:本地分支、本地远程分支、远程分支。除非fetch或者pull,本地交互的远程分支都是本地缓存的远程分支。
<remote>/<barance>:代表的是本地的远程分支,不可编辑。只能用来创建新分支或者合并到本地分支。
一般来说,本地对比的远程分支,都是本地远程分支;除非连接远程服务器拉取新数据。比如 git fetch。
git ls-remote <remote>或者git remote show <remote>:查看远程分支信息
git fetch <remote>:拉取远程分支
git push <remote> <localBrance>:<removeBrance>:推送分支到远程仓库。localBrance为空时,即将空分支推送到远程,即是删除远程分支。可以省略远程分支。
git push <remote> --delete <brance>:删除远程分支
**跟踪远程分支:**
git checkout -b <branch> <remote>/<branch>:根据远程分支创建本地分支并切换过去。
git checkout --track <remote>/<brance>:同上。
git checkout <brance>:如果brance不存在,且远程分支存在该brance,则自动创建本地分支并关联远程分支,然后切换过去。
git brance -u <remote>/<brance>:将当前分支跟踪的远程分支更改为brance。'-u'可以写成'--set-upstream-to'。
git branch -vv:查看所有跟踪分支。
git fetch --all:拉取所有远程分支到本地。名字是<remote>/<brance>。
#### 分支变基
原则:**只对尚未推送或分享给别人的本地修改执行变基操作清理历史, 从不对已推送至别处的提交执行变基操作,这样,你才能享受到两种方式带来的便利。**
基于变基的合并分支方法:
```
#当前在a,需要合并b
git rebase b
#处理冲突
git add .
git rebase --continue
```
Git笔记