Git
廖雪峰的git教程
git-cheat-sheet
- 创建仓库
- git add 暂存区
- git commit
- 节点
- 远程仓库
- git push
- merge
- 回滚
- rebase
定义
分布式版本控制系统。与集中式分布系统(如svn)相比,git有本地仓库,可以在本地进行操作。而svn这样的集中式分布系统,修改只能直接保存到中央服务器。
创建仓库
创建仓库即在某个目录下,创建一个git仓库。git仓库其实就是在这个目录增加了一个.git目录。
命令:
git init
工作流程
工作区
就是.git所在目录。
版本库
即.git目录
暂存区
即stage,add的内容会保存在暂存区,等待被commit
add
将文件添加到暂存区。
命令:
git add
commit
将暂存区修改内容提交到代码仓库。
命令:
git commit -m "xxxx"
diff
查看已经修改,并且没有存入暂存区的文件进行了哪些修改。
命令:
git diff xxxx
rm
删除某一个文件。当在工作区删除掉某个文件后,使用rm命令可以将这个删除提交到暂存区。之后commit,就可以把删除提交到版本库里。
命令:
git rm xxxx
查看日志
log
查看历史commit日志。
命令:
//普通查看
git log
//一行简洁的查看
git log --pretty=oneline
reflog
查看历史提交
git reflog
回滚
reset
重新设置当前的head
命令:
//回到上次commit
git reset --hard HEAD^
//回到上上次commit
git reset --hard HEAD^^
^^的数量表示第上几次提交
//回到某一次提交
git reset --hard 2d2ec8e(替换为具体的版本号,前几位也可以)
//取消某一个add的文件
git reset xxxx
//取消所有add的文件
git reset .
checkout
回撤命令。
如果修改还没有add,则回退到和版本库一样的状态。
如果修改已经add,则回退到上一次add的状态。
总之,就是让文件回到上一次add
或者commit
的状态。
命令:
git checkout xxxfile
回撤命令
回撤命令,可以回撤已经添加到暂存区的内容。将暂存区内容返回到工作区。
命令:
git reset head readme.txt
//或者
git checkout head readme.txt
恢复文件
恢复删除的文件。本质上,checkout就是用版本库里的版本,替换工作区里的版本。
命令:
git checkout -- test.txt
远程仓库
关联远程仓库
orgin指代了远程仓库,在push时,不需要完整的仓库地址,只需要orgin就可以知道要推送到的远程仓库是哪个。
git remote add origin https://github.com/TokenYc/learngit.git
push
将本地仓库推送到远程仓库
-u
的作用是将当前分支与远程分支进行绑定,这样下次在本分支推送的时候,直接git push
即可。
git push -u origin master
clone
将远程仓库克隆到本地
git clone [email protected]:TokenYc/gitskills.git
分支
分支指向某一次提交。当HEAD指向某一个分支的时候,就表示当前在这个分支工作。
分支创建
git branch
切换分支
//新的方式,优先使用这种
git siwtch
//老的方式,容易混淆
git checkout
分支创建并切换
//新的方式,优先使用这种
git switch -c
//比较老的方式,容易混淆
git checkout -b
查看分支
git branch
合并分支
git merge
删除分支
git branch -d
快速合并
两个分支之间没有冲突,会触发快速合并,原本分支的指针,直接指向合并分支的分支指针。
合并冲突
当两个分支对同一个内容进行了修改,会产生合并冲突。
解决方式:
- 编辑出现冲突的文件。
- add
- commit
查看分支合并情况
//原始方法
git log
//用图的形式展示
git log --graph
//用图的形式更简洁的展示
git log --graph --pretty=oneline --abbrev-commit
禁用快速合并
使用快速合并,如果开发分支删除了,就看不出来之前的合并了。
可以通过合并时添加参数,使用普通方式代替快速合并。在合并时,会产生一个新的节点。
git merge --no-ff -m "merge with no-ff" dev
stash
存储工作现场。方便去其他分支修改东西。
git stash
//查看stash
git stash list
//还原最新的现场,不删除stash
git stash apply
//删除最新的stash
git stash drop
//还原最新的现场并且删除stash
git stash pop
//还原某一次现场,编号可以通过list查看
git stash pop xxxxx
cherry-pick
将某一次提交复制到当前分支,生成一个新的提交。
git cherry-pick [提交id]
强制删除分支
未合并的分支无法用-d删除,需要使用-D大写来删除
git branch -D xxx
查看远程分支
//查看远程分支
git remote
//查看远程分支详细信息,如果没有推送权限就看不到推送地址
git remote -v
推送到远程仓库
//指定本地分支
git push origin [分支名称]
拉取分支
从远程拉取分支到本地
git checkout -b dev origin/dev
//或者
git switch -c dev origin/dev
指定本地分支与远程分支链接
如果没有设置,git pull会失败
git branch --set-upstream-to=origin/dev dev
Rebase
A分支合并到B分支,B分支的修改,都挪到A分支的头部,这样提交的节点就在一条线了。
合并远程分支或者其他分支,如果有冲突,会产生一个分支合并的节点,产生分叉。使用rebase某个分支,可以消除分叉, 使分支更新的内容基于远程分支的最新更新。
git rebase
如果产生冲突,先修改产生冲突的问题。然后add,再执行
git rebase --continue
可能出现多次rebase,需要多次进行上面的操作。
Tag
打tag
打tag就是指定一个指针指向某一次提交,用于记录版本。
git tag v1.0
查看所有标签
git tag
对某一次提交打tag
git tag v1.1 f52c633
//附带说明
git tag -a v1.1 -m "1.1版本"
展示某个tag指向的提交
git show v1.0
将tag推送到远程分支
//推送单个
git push v1.0
//推送所有tag
git push --tags
删除标签
git tag -d v1.1
删除远程标签
//1.先删除本地分支
git tag -d v1.1
//2.推送删除远程分支
git push origin :refs/tags/v1.1
Github如何pr
1、从主项目中fork一份到自己的仓库。
2、提交代码到fork的仓库。
3、在fork的仓库里申请pr
配置
忽略文件
添加一个.gitignore文件,在里面添加需要忽略的文件并提交,就可以实现文件忽略了。
如果需要强行add某个文件
git add -f xxxx
找到哪个配置忽略了文件
git check-ignore -v App.class
设置例外规则
.*
!.gitignore
配置别名
git config --global alias.st status
设置一个漂亮的log
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"
删除配置的别名:
如果是针对仓库的,在.git/config中删除。
如果是针对全局的,在user/.gitconfig中删除