根据https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000教程整理的git学习笔记。另附Git官网地址:http://git-scm.com。w
1、创建版本库
设置全局的姓名和email:
$ git config --global user.name"Your Name"$ git config --global user.email"email@example.com"
初始化一个Git仓库,使用git init命令;
添加文件到Git仓库,分两步:
使用命令git add 命令,可以用空格间隔多个文件名,添加多个文件;
使用命令git commit -m "说明信息",完成。
2、时光机穿梭
2.1 查看修改的内容
git status 查看工作区的状态可以知道哪个文件被修改;
git diff 文件名 查看该文件的修改内容,比较的是工作区和暂存区,也就是没有add时看到的改动。
2.2 在不同的版本之间切换
git log 查看过去提交(commit)的记录;
git log --pretty=oneline 一行简略查看过去提交的记录;
在过去的记录中,要注意commit id(版本号),由SHA1计算出的一个很大的数,可以通过commit id进行不同版本的切换;
git reset --hard [commit id] 切换到指定id的版本,若不产生歧义,id可以只写前几位;
git reset --hard HEAD^ 切换到当前版本的上一个版本,其中HEAD表示当前版本,一个^代表上一个版本,HEAD~100上100个版本;
git reflog 查看过去命令的记录。
2.3 管理修改
Git管理的是修改,而不是文件。
第一次修改 -> git add -> 第二次修改 -> git commit 中,因为add命令添加了第一次修改,所以只提交了第一次修改。
git diff HEAD -- readme.txt 查看add操作之后的改动。
2.4 撤销修改
1、当乱改了文件的内容,还没有add,则使用命令git checkout -- file撤销修改;
2、当乱改了文件的内容,已经add了,则使用命令git reset HEAD file撤销暂存区的修改,再回到第1步;
3、已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库(对这句话存疑)。
2.5 删除文件
1、真要删除某个文件:先通过rm删除该文件,再通过git rm file增加删除文件的修改,最后commit提交;
2、若是误删某个文件:通过git checkout -- file恢复该文件,git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
3、远程仓库
3.1 Github添加秘钥
1、创建SSH秘钥: ssh-keygen -t rsa -C "youremail@example.com",在用户目录下会有.ssh文件夹,文件夹底下有公钥文件id_rsa.pub;
2、将id_rsa.pub文件中的内容添加到Github Setting页面里的SSH Key里。
3.2 添加远程库
1、git remote add origin git@github.com:username/learngit.git;相当于为远程仓库地址取名叫origin;
2、第一次push时,git push -u origin master,-u将本地的master分支和远程的master分支关联起来;
3、后面再push时,可以直接使用git push origin master。
3.3 从远程库克隆
克隆命令:git clone git@(https//)github.com:username/learngit.git。
4、分支管理
4.1 创建和合并分支
当修改自己的代码到一半不能提交保存时,为了防止自己干了一半的东西因为异常消失,可以创建自己的分支,在自己的分支中进行修改,然后切换到主分支用merge命令合并,最后再删除自己的分支。
1、查看分支:git branch;
2、创建分支:git branch ;
3、切换分支:git checkout ;
4、创建并切换分支:git checkout -b ;
5、合并某分支到当前分支:git merge ,其中自动采用的是fast-forward模式合并的,即将当前分支指向被合并分支的最新结点。
6、删除分支:git branch -d
4.2 解决冲突
当自己分支的代码和主分支别人提交的在merge过程发生冲突,可以在文件中看到冲突的地方,然后对其进行合并,最后add commit提交合并后的内容,最后删除自己的分支(自己的分支还是在的)。
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
git log --graph --pretty=oneline --abbrev-commit 可以以图形的形式查看分支。
4.3 分支管理策略
强制禁用Fast-forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
git merge --no-ff -m "说明信息" dev,--no-ff表示禁用fast-forward模式;
在工作中,最终上线的代码都在master分支上,具体迭代的修改在dev分支上,其他人再建立各自的分支,做出修改后提交到dev分支上,最后dev分支合并到master分支上上线完成版本迭代。
4.4 Bug分支(临时改bug)
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除bug分支;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。
git stash pop:恢复的同时把stash内容也删了;
git stash apply:恢复后,stash内容并不删除;
git stash drop:删除stash内容。
4.5 Feature分支(增加新功能)
添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
git branch -D 分支名:强行删除一个没有合并过的分支。
4.6 多人协作
1、git remote -v:查看远程库信息;
2、本地新建的分支不push到远程库,对别人而言就是不可见的;
3、想提交一个新的分支到github上:
(1)若该分支在github上已经有了,则使用git checkout -b dev origin/dev创建本地分支即可,该命令也会将本地分支和远程分支自动关联;或者使用git checkout -b dev先创建并切换到本地分支,再通过git branch --set-upstream-to=origin/dev建立本地dev分支和远程dev分支的联系
(2)若该分支在github上没有,则先创建本地分支,再git push -u origin dev提交分支,-u将本地dev分支和远程dev分支关联起来。
4、当别人先提交改动到dev分支上,本地就不能直接git push origin dev提交改动,先要git pull (origin dev)把别人的改动拉到本地merge,处理冲突,并commit,接着才能push。其中,需要注意的是pull并不是把远程库的文件拉过来覆盖当前文件,而是与本地文件merge合并。
PS:删除远程关联:git remote rm origin
建立远程关联:git remote add origin git@github.com:xxx/xxx。
5、标签管理
5.1 创建标签
1、commit id不好记,所以需要tag来表示某个版本,如v1.0;
2、首先切换到需要打tag的分支;
3、git tag v1.0 用于新建一个标签,默认为HEAD,也可以指定一个commit id;
4、git show 查看标签信息:
5、git tag -a -m "标签信息" 可以指定标签信息;
6、git tag -s -m "标签信息"""可以用PGP签名标签;
7、git tag可以查看所有的标签。
5.2 操作标签
1、git push origin 向远程库推送一个tag;
2、git push origin --tags 向远处库推送全部未推送的本地tag;
3、git tag -d 删除一个本地tag;
4、git push origin :refs/tags/删除一个远程的tag。
6、GitHub
参与别人开源项目的构建:
1、在GitHub上,可以任意Fork开源仓库;
2、自己拥有Fork后的仓库的读写权限;
3、可以推送pull request给官方仓库来贡献代码。
7、自定义Git
1、让Git显示颜色,会让命令输出看起来更醒目:git config --global color.ui true;
2、让git忽略某些特殊文件:
在Git工作区根目录下新建一个文件.gitignore,其中包含了所有需要忽略的文件或目录;
可以参考https://github.com/github/gitignore上的.gitignore文件进行修改;
如果想添加某个被忽略的文件:
(1)可以使用git add -f 强制添加;
(2)可以使用git check-ignore -v 查看是.gitignore文件的哪一行添加了该文件名。
3、配置别名:(如,将git status命令改为git st)
git config <--global> alias.st status;加上<--global>代表该别名全局有效,配置文件为用户目录下的.gitconfig文件。
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" 一键配置log
别名的配置不是全局的,可以在.git/config底下的[alias]标签看到;是全局的,则在用户主目录下的.gitconfig文件中可以看到。
4、建立Git服务器可以参考链接:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137583770360579bc4b458f044ce7afed3df579123eca000