git学习笔记 - XLab-Tongji/KAOSer GitHub Wiki

git

Git是目前世界上最先进的分布式版本控制系统

安装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协议速度最快。

分支管理

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>可以删除一个远程标签。
⚠️ **GitHub.com Fallback** ⚠️