git学习笔记 - XLab-Tongji/KAOSer GitHub Wiki
Git是目前世界上最先进的分布式版本控制系统
官网下载,默认安装后,打开Git Bash,在命令行输入
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
版本库又称仓库,repository. mkdir 版本库名 cd 创建好的版本库名 首先选择一个合适的地方创建空目录,在命令行输入
$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
pwd命令用于显示当前目录。 第二步,通过git init命令把这个目录变成Git可以管理的仓库:
$ git init
添加文件到仓库,分两步:
使用命令git add <file>,注意,可反复多次使用,添加多个文件,告诉Git把文件添加到仓库。
使用命令git commit -m <message>,把文件提交到仓库,完成。
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
git status 掌握仓库当前状态
git diff 查看具体修改的内容
git log 可以查看提交历史,以便确定要回退到哪个版本
git reflog 查看命令历史,以便确定要回到未来的哪个版本
git reset --hard commit_id 允许我们在版本的历史之间穿梭
git reset --hard HEAD^ 回退到上一个版本,HEAD^^表示上上一个版本,HEAD~100表示第前一百个版本
工作区(Working Directory)就是你在电脑里能看到的目录。 版本库(Repository)工作区有一个隐藏目录.git,这个是Git的版本库。 版本库里有一个称为stage(或者叫index)的暂存区,还有git自动创建的第一个分支master,以及指向master的一个指针叫HEAD. 把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
可以用git diff HEAD -- readme.txt命令可以查看工作区和版本库里面最新版本的区别。每次修改,如果不用git add到暂存区,那就不会加入到commit中。
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令
git checkout -- file。
命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
- 一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
- 一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令
git reset HEAD <file>,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
手动删除文件或者输入命令rm 。
- 情况1:确定要从版本库中删除该文件,那就用命令git rm删掉,并且git commit。
- 情况2:误删文件,想恢复,如果只删除了工作区的文件,直接用git check -- 就可以。如果执行了git rm,还没有git commit,需要先git reset HEAD ,然后再git checkout -- 。如果执行完git commit后就不能用checkout恢复了,要用git reset --hard HEAD^,且会丢失最近 一次提交后修改的内容。
本地仓库Git与GitHub仓库之间的传输是通过SSH加密的,所以第一步需要创建SSH Key,先在主目录看有没有.ssh目录,里面有没有id_rsa和id_rsa.pub两个文件。如果没有需要创建: $ ssh-keygen -t rsa -C "[email protected]"
如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
第二步在GitHub添加SSH Keys,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容。如果有多台电脑,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。
要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;关联后,使用命令git push -u origin
master第一次推送master分支的所有内容;此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送
要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。
- 例如:
$ git clone [email protected]:michaelliao/gitskills.git
master指向最新的提交,HEAD指向master以确定当前分支。当新建一个分支dev后,指向master相同的提交,HEAD指向dev。然后对工作区的修改和提交都是针对dev分支了,即dev指针向前移动而master指针不变。合并时直接把master指向dev的当前提交(Fast-forward)。删除dev分支就是把dev指针给删掉。
- 查看分支:
git branch - 创建分支:
git branch <name> - 切换分支:
git checkout <name> - 创建+切换分支:
git checkout -b <name> - 合并某分支到当前分支:
git merge <name> - 删除分支:
git branch -d <name>
当合并有冲突时,需要手动编辑冲突的文件,再提交,再合并。git status可以查看冲突的文件。
查看分支合并图:$ git log --graph --pretty=oneline --abbrev-commit
合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。例如合并dev并加上commit的描述:$ git merge --no-ff -m "merge with no-ff" dev
团队合作的分支策略:首先master分支是非常稳定的,仅用来发布新版本,平时不能在上面干活。干活在dev分支上,dev分支是不稳定的,每个人都在dev 分支上干活,每个人都有自己的分支,时不时往dev分支上合并。
- 暂存工作现场:
git stash - 查看存储的工作现场:
git stash list
恢复工作现场有两个方法,一是用git stash apply恢复,但是恢复后,stash内容并不删除,需要用git stash drop来删除;另一种方式是用git stash pop,恢复的同时把stash内容也删了。 可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:$ git stash apply stash@{0}
每开发一个新功能,最好新建一个feature分支,在上面开发,完成后合并,最后删除该feature分支。如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。
- 查看远程库信息:
git remote -v - 在本地创建和远程分支对应的分支(本地和远程分支的名称最好一致):
git checkout -b branch-name origin/branch-name - rebase操作可以把本地未push的分叉提交历史整理成直线:
git rebase
多人协作的工作模式通常是这样:
- 首先,可以试图用
git push origin <branch-name>推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull试图合并; 如果合并有冲突,则解决冲突,并在本地提交; 没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功! - 如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令
git branch --set-upstream-to <branch-name> origin/<branch-name>
标签是与commit挂钩的。
- 命令
git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id;例:$ git tag v0.9 f52c633 - 命令
git tag -a <tagname> -m "blabla"可以指定标签信息;例:$ git tag -a v0.1 -m "version 0.1 released" 1094adb - 命令
git tag可以查看所有标签。标签不是按时间顺序列出,而是按字母排序的。可以用git show 查看标签信息。 - 命令
git push origin <tagname>可以推送一个本地标签; - 命令
git push origin --tags可以推送全部未推送过的本地标签; - 命令
git tag -d <tagname>可以删除一个本地标签; - 命令
git push origin :refs/tags/<tagname>可以删除一个远程标签。