git 学习资源
核心理解
三个区域
- 工作目录
- 索引(暂存区)
- 历史
提交
git的提交是文件历史状态的快照 ,Git 中的分支,其实本质上仅仅是个指向 commit 对象的可变指针。Git 会使用 master 作为分支的默认名字。在若干次提交后,你其实已经有了一个指向最后一次提交对象的 master 分支,它在每次提交的时候都会自动向前移动。
HEAD
Git 是如何知道你当前在哪个分支上工作的呢?其实答案也很简单,它保存着一个名为 HEAD 的特别指针。它是一个指向你正在工作中的本地分支的指针(译注:将 HEAD 想象为当前分支的别名)。每次提交后 HEAD 随着当前分支一起向前移动 。切换到哪个分支,哪个分支就成为自动向前移动的指针HEAD。 HEAD^ 代表上一次提交的版本,HEAD^^ 代表上上次提交的版本,HEAD~100 表示上 100 次提交的版本
合并
合并分两种情况,fast-forward(快进),分叉合并。前者中两个分支是直系亲属,后者,没有直系关系,但是有共同的祖先。
本地常用操作
本地新建、添加、提交
mkdir rep_name
cd rep_name
git init # 本地仓初始化
...
git add . # 添加到索引
git commit -m 'xxx' # 提交到历史
git status # 查看状态
git log --graph --pretty=oneline --abbrev-commit # 查看提交、合并历史
查看、删除暂存区文件
git ls-files # 查看
git rm -r --cached <file_name>
分支新建、切换、删除、合并、重命名
git branch # 查看分支列表
git branch <branch_name> # 新建分支
git checkout <branch_name> # 切换分支
git branch -b <branch_name> # 新建分支并切换
git branch -d <branch_name> # 删除分支
# 切换到 master 分支,与另一个分支合并
git checkout master
git merge <branch_name>
git branch -m <old_name> <new_name> # 分支重命名
切换到指定的分支或提交
每一次提交都是一个历史节点,而 HEAD、分支、标签分布在部分历史节点之上。
git checkout
git checkout HEAD~ # 将head指向上一次提交的节点,同时恢复索引和工作目录,分支指向不动
放弃本地修改
- 放弃本地修改
git checkout -- <file>
,git checkout .
- 如果已经执行
git add .
了,那么先执行git reset HEAD <file>
, 再执行以上命令
如果不区分两种情况,可以执行执行
git reset --hard HEAD
提交和本地同时恢复
git reset --hard <commit_id> | HEAD~<n> # 将提交恢复到 commit_id, 而本地也相应改变
commit_id 之后的提交记录通过 git log 不再显示,使用
git reflog
找到对应的 commit id
撤销提交而本地不变
git reset --soft <commit_id> # 将提交恢复到 commit_id, 而本地不变
修改提交(覆盖提交)
git commit --amend
git commit --amend --no-edit
与远程仓(github)交互
建立 ssh 连接
- 本地安装 git
- 产生密钥
ssh-keygen -t rsa # 之后输入三个回车
- 将
C:\Users\Administrator\.ssh\id_rsa.pub
中的公钥添加到 github 个人账户 - 测试
ssh -T git@github.com
本地仓与远程仓关联
本地先有
- 在 github 新建仓库
- 本地与远程建立关联
git remote add origin git@github.com:username/rep_name.git # 建立关联 git remote # 查看与之关联的远程仓 git remote remove origin # 取消与远程仓的关联
远程先有
git clone git@github.com:username/rep_name.git # 默认 clone master 分支
git clone -b <branch_name> <address> # clone 指定分支
本地与远程的同步
git fetch origin <branch_name> # 下载远程分支到本地
git pull origin <branch_name> # 下载远程分支到本地,并与当前分支合并
git push origin <branch_name> # 上传当前分支,并与远程仓指定分支合并
git push -u origin master -f # 强制推送到远程分支
查看改动,对比分支不同
git diff HEAD --stat # 与当前 HEAD 相比, 列出改动的文件列表
git diff <branch_1> <branch_2> --stat # 比较两个分支不同的文件列表
git diff <branch_1> <branch_2> <file_name> # 查看某个文件具体内容的不同之处
其它
git branch -r # 查看远程分支
git push origin --delete <branch_name> # 删除远程分支
gitignore 规则
新建 .gitignore 文件,在其中添加 git 命令忽略的目录。但是,.gitignore 只能忽略那些原来没有被 track 的文件,如果某些文件已经被纳入了版本管理中,则修改 .gitignore 是无效的,解决办法:
git rm -r --cached .
git add .
git commit -m 'update .gitignore'
git 别名
建议直接复制更改 .gitconfig
文件
[user]
email = daibingh@gmail.com
name = daibingh
[alias]
st = status
co = checkout
ci = commit
br = branch
lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit