目录
一、Git简介
1、安装Git
2、创建版本库
二、时光机穿梭
git status可以查看工作区当前的状态,告诉你哪些文件被修改过
git diff可以查看修改内容
1、版本回退
git log可以显示从最近到最远的提交日志,如果嫌输出信息太多,可以加--pretty=oneline的参数
HEAD表示当前版本,HEAD^表示上一个版本,HEAD^^表示上上个版本,往上一百个版本是HEAD~100。
git reset --hard HEAD^ 回退到上一个版本
git reset --hard 1094a(commit id的简写),穿梭到1094a版本
git reflog 记录每一次命令,可以找到所有的commit id
2、工作区和暂存区
.git是Git的版本库,存了很多东西,最重要的是stage(或叫index)的暂存区,还有Git自动创建的第一个分支master,以及指向master的一个指针HEAD。
git add是把文件修改添加到暂存区。
git commit是把暂存区的所有内容提交到当前分支。
3、管理修改
第一次修改->git add ->第二次修改->git add->git commit
理解Git式如何跟踪修改的,每次修改,如果不用git add到暂存区,那就不会加入到commit中。
4、撤销修改
修改还未git add
修改了文件内容,但是还没有git add时,可以使用git restore <filename>或者git checkout -- <filename>撤销修改。
git checkout -- <filename> 意思就是,把filename文件在工作区的修改全部撤销,这里有两种情况。
1.<filename>在修改之后还没有被放到暂存区(还没有git add过),现在,撤销修改就回到和版本库一模一样的状态
2.<filename>已经添加到暂存区后(已经git add过),又做了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让filename回到最近一次git commit或git add时的状态。
修改已经git add,还未commit,修改只是添加到暂存区,还未提交。
可以使用git reset HEAD <filename>或git restore --staged readme.txt把暂存区的修改撤销掉,重新放回工作区。
丢弃工作区的修改可以使用git restore <filename>或者git checkout -- <filename>撤销修改。(参考上一小节)
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新版本。
修改已经git add,已经git commit——参考章节二、1、版本回退
5、删除文件
示例1:
新增test.txt-> git add test.txt(添加到版本库)-> git commit -m "add test.txt" -> rm test.txt(从工作区删除) -> git rm test.txt(从版本库删除)-> git commit -m "delete test.txt"
示例2:误删,但是版本库中还有,就可以把误删的文件恢复到最新版本
新增test.txt->git add test.txt(添加到版本库)->rm test.txt(从工作区删除)->git checkout --test.txt(将版本库的恢复到工作区)
git checkout就是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
三、远程仓库
1、添加远程库
git push -u origin master 把本地库的所有内容推送到远程库上。由于远程库是空的,第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时可以简化命令。
2、从远程库克隆
git clone
四、分支管理
1、创建与合并分支
git branch 查看分支
git branch <name> 创建分支
git checkout <name> 或 git switch <name> 切换分支
git chekcout -b <name> 或 git switch -c <name> 创建+切换分支
git merge <name> 合并某分支到当前分支
git branch -d <name> 删除分支
2、解决冲突
git switch -c feature1 -> git add readme.txt -> git commit -m " " -> git switch master -> git add readme.txt -> git commit -m " " -> git merge feature1 -> 需要手动解决冲突 -> git add readme.txt -> git commit -m "confilct fixed"
git log --graph --pretty=oneline --abbrev-commit 可以查看分支合并图
3、分支管理策略
方式一、git switch -c dev -> git add readme.txt -> git commit -m "add merge" -> git switch master -> git merge --no-ff -m "merge with no-ff" dev
方式二、git switch -c dev -> git add readme.txt -> git commit -m "add merge" -> git switch master -> git merge dev
方式一可以从分支历史上看出分支信息,如上图黄框所示;方式二不能,如上图蓝框所示。
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支。使用--no-ff方式可以强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
git merge --no-ff -m "merge with no-ff" dev 因为--no-ff合并会创建一个新的commit,所以要加上-m参数,把commit描述写进去。
4、Bug分支
git stash可以把当前工作现场先暂存起来。
两种方式恢复现场:
git stash apply,但是恢复后,statsh内容并不删除,需要用git statsh drop删除。
git stash pop,恢复的同时把stash内容也删了。
可以多次stash, 恢复的时候,先用git stash list查看,然后恢复指定的stash——git stash apply stash@{0}
在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit_id>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。(也就是可以复制某个分支的某个commit修改)
5、Feature分支
开发一个新feature,最好新建一个分支。
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>进行删除。
6、多人协作
查看远程库信息,使用git remove -v
从本地推送分支,使用git push origin <branch_name>,如果推送失败,说明远程分支比本地更新,需要先用git pull合并,如果合并有冲突,则解决冲突,并在本地提交commit;没有冲突或解决掉冲突后,则解决冲突,并在本地提交。
没有冲突或者解决掉冲突后,再用git push origin <branch_name>推送就能成功。
如果git pull提示no tracking information,说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to branch_name origin/branch_name建立关联。
7、Rebase
git rebase可以把分叉的提交历史整理成一条直线,看上去更直观。缺点是本地的分叉提交已经被修改过了。
五、标签管理
发布一个版本时,通常先在版本库中打一个标签,这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。Git的标签虽然是版本库的快照,但其实是指向某个commit的指针,所以,创建和删除标签都是瞬间完成的。
1、创建标签
git tag <tagname> <commit id>新建一个标签,默认为HEAD,也可以指定一个commit id
git tag -a <tagname> -m "blablabla..." <commit id> 可以指定标签信息
git tag 查看所有标签。标签不是按时间顺序列出的, 是按字母排序的。
git show <tag name> 可以查看标签信息
2、操作标签
git push origin <tag name> 推送某个标签到远程
git push origin --tags 一次性推送全部尚未推送到远程的本地标签
git tag -d <tag name> 删除本地标签
git tag origin :refs/tags/<tag name> 删除远程标签
六、自定义Git
git config --global color.ui true 让Git显示颜色,让命令输出看起来更醒目。
1、忽略特殊文件
在Git工作区的根目录下创建一个特殊的.gitignore文件,把要忽略的文件名填进去,Git就会自动忽略这些文件。
把指定文件排除在.gitignore规则外的写法就是 !文件名,所以,只需要把例外文件添加到.gitignore即可。
2、配置别名
git config --global alias.** ****
--global是针对当前用户起作用的,如果不加,只针对当前仓库起作用。
每个仓库的Git配置文件都放在 .git/config文件中。当前用户的Git配置文件放在用户主目录(C:\Users\计算机名字\)下的一个隐藏文件.gitconfig中。别名就在[alias]后面,要删除别名,直接把对应行删掉即可。
$ git config --global alias.co checkout $ git config --global alias.ci commit $ git config --global alias.br branch $ 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"
3、搭建Git服务器
参考资料:廖雪峰的官方网站——https://www.liaoxuefeng.com/wiki/896043488029600