初始配置

Git 装好之后要先配置用户名和邮箱,提交记录里显示的就是这两项。邮箱用的是 GitHub 提供的 noreply 邮箱,这样提交记录里不会暴露真实邮箱:

git config --global user.name "canghai0823"
git config --global user.email "[email protected]"

国内访问 GitHub 经常连不上,给 Git 单独配置代理:

git config --global http.proxy socks5h://127.0.0.1:10808
git config --global https.proxy socks5h://127.0.0.1:10808

不需要代理的时候取消掉:

git config --global --unset http.proxy
git config --global --unset https.proxy

查看当前所有配置:

git config --list

--global是全局配置,对所有仓库生效。如果某个仓库要用不同的用户名邮箱,在仓库目录里去掉--global再执行一遍就行,仓库配置的优先级高于全局。

创建仓库

在当前目录初始化一个新仓库:

git init

克隆远程仓库到本地:

git clone https://github.com/user/repo.git

克隆时可以指定目录名,也可以用--depth 1只拉最近一次提交,大仓库能省不少时间和流量:

git clone --depth 1 https://github.com/user/repo.git myrepo

日常提交

查看当前状态,哪些文件改了、哪些没跟踪,都在这里看:

git status

把文件加入暂存区:

git add file.txt

加所有改动:

git add .

提交:

git commit -m "提交说明"

如果文件之前已经被跟踪过,可以用-a跳过add直接提交:

git commit -am "提交说明"

刚提交完发现说明写错了,或者漏了个文件,用--amend修改上一次提交:

git commit --amend -m "新的提交说明"

需要注意--amend会改掉提交记录,已经 push 过的提交不要再 amend。

查看改动和历史

查看工作区和暂存区的差异:

git diff

查看暂存区和上次提交的差异:

git diff --cached

查看提交历史:

git log

历史太长的话,一行显示一条更清楚:

git log --oneline

加上--graph能看到分支合并的图:

git log --oneline --graph --all

查看某次提交具体改了什么:

git show 提交ID

撤销操作

工作区改乱了,想恢复成上次提交的样子:

git checkout -- file.txt

已经add了想撤回暂存:

git reset HEAD file.txt

撤销整个提交有两种方式。reset直接把分支退回到某次提交,之后的提交记录就没了:

git reset --hard 提交ID

--hard会把工作区的改动一起丢掉,用之前想清楚。如果想保留改动只撤销提交记录,用--soft

git reset --soft HEAD^

revert是生成一次新提交来抵消之前的提交,历史记录还在,已经 push 过的提交要撤销用这个更安全:

git revert 提交ID

如果reset --hard退过头了,可以用reflog找回来,它记录了 HEAD 的所有移动:

git reflog

分支操作

查看分支,当前分支前面有个*

git branch

创建分支:

git branch dev

切换分支:

git checkout dev

创建并切换,一步到位:

git checkout -b dev

把 dev 分支合并到当前分支:

git merge dev

合并出现冲突时,Git 会在冲突文件里用<<<<<<<>>>>>>>标出两边的内容,手动改完之后addcommit就完成合并了。

删除已合并的分支:

git branch -d dev

没合并的分支用-d删不掉,确定不要了用-D强制删除。

远程仓库

查看远程仓库地址:

git remote -v

添加远程仓库,origin是习惯用的名字:

git remote add origin https://github.com/user/repo.git

修改远程地址:

git remote set-url origin https://github.com/user/repo.git

第一次推送分支,加-u把本地分支和远程分支关联起来,以后直接git push就行:

git push -u origin master

之后的日常推送和拉取:

git push
git pull

pull相当于fetchmerge。如果只想把远程的更新拿下来先看看,不着急合并:

git fetch

暂存现场

改到一半需要切分支处理别的事,改动还不想提交,可以先存起来:

git stash

查看存了哪些:

git stash list

回来之后恢复现场:

git stash pop

pop会恢复并删掉这条记录,如果想恢复但保留记录用git stash apply

标签

发版本的时候打个标签,方便以后找到对应的提交:

git tag v1.0

给之前的某次提交补标签:

git tag v0.9 提交ID

查看所有标签:

git tag

标签默认不会被 push 上去,要单独推:

git push origin v1.0

一次推所有标签:

git push origin --tags

删除本地标签:

git tag -d v1.0

忽略文件

仓库根目录建一个.gitignore文件,写上不想跟踪的文件和目录,一行一条:

*.log
node_modules/
.DS_Store

需要注意.gitignore只对没跟踪过的文件生效,已经提交过的文件要先从暂存区移除:

git rm --cached file.log

再提交一次之后,这个文件就不再被跟踪了。