Git 的正确使用姿势与最佳实践:团队协作和版本控制的最佳实践;
-
Git是目前世界上最先进的分布式版本控制系统,Git是用C语言开发的
-
集中式版本控制系统:版本库是集中存放在中央服务器的,使用时,先从中央服务器取得最新的版本,使用后,再把内容推给中央服务器。缺点:需要联网才能工作;如果中央服务器出了问题,具有很大风险
分布式版本控制系统:没有中央服务器,每个电脑上都是一个完整的版本库。实际使用中,分布式版本控制系统通常也有一台充当中央服务器的电脑,利于交换修改。
-
目前,Git在Linux、Unix、Mac和Windows几大平台上正常运行
-
版本库又名仓库(repository),其中所有的文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以还原。
创建一个版本库:创建一个空目录;通过git init命令把这个目录变成Git可以管理的仓库;这个目录默认隐藏,用ls -ah命令就可以看见
注意:所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等;对图片、视频这些二进制文件,版本控制系统可以管理,但是没法跟踪文件的变化。文本编码建议使用标准的UTF-8编码。
对于windows,不要使用自带的记事本编辑任何文本文件,建议使用Visual Studio Code代替记事本。
-
使用:
编写一个readme.txt文件,放到learngit或其子目录下(即Git仓库)
用git add将文件添加到仓库
用git commit将文件提交到仓库,-m后面输入的是本次提交的说明
Q&A:
Q:输入
git add readme.txt,得到错误:fatal: not a git repository (or any of the parent directories)。A:Git命令必须在Git仓库目录内执行(
git init除外),在仓库目录外执行是没有意义的。Q:输入
git add readme.txt,得到错误fatal: pathspec 'readme.txt' did not match any files。A:添加某个文件时,该文件必须在当前目录下存在,用
ls或者dir命令查看当前目录的文件,看看文件是否存在,或者是否写错了文件名。 -
命令:
git status:让我们时刻掌握仓库当前的状态
git diff:查看difference
git log:显示从最近到最远的提交日志,如果嫌输出信息太多,可以加参数--pretty=oneline参数。每提交一个新版本,Git就会把它们自动串成一条时间线。
版本:HEAD表示当前版本,上一个版本为HEAD^,上上一个版本为HEAD^^,往上100个版本为HEAD~100
回退版本:git reset --hard HEAD^
要找到回退之前的版本,需找到版本的版本号(commit id),(假如commit id 为1094adb……)使用命令git reset --hard 1094a。(版本号可以不写全,适当即可,Git会自动去找)
git reflog:记录每一次命令
git diff HEAD -- readme.txt:查看工作区和版本库里面最新版本的区别
git checkout -- file:丢弃工作区的修改
两种情况:文件自修改后还没有被放到暂存区,此时撤销修改就回到和版本库一模一样的状态;文件已经被放到暂存区,撤销修改就回到添加到暂存区后的状态。
git reset HEAD :既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
git rm:从版本库中删除该文件,之后再git commit
-
工作区(Working Directory):即电脑能看见的目录
版本库(Repository):工作区有一个隐藏目录.git,即Git的版本库。存储了很多东西,最重要的是stage(或叫index)的暂存区,还有Git自动创建的第一个分支master,及指向master的指针HEAD
-
Git比其他版本控制系统设计优秀原因:Git跟踪并管理的是修改,而非文件。
-
本地Git仓库与GitHub仓库之间的传输是通过SSH加密的
-
要关联一个远程库,使用命令:
git remote add origin git @server-name:path/repo-name.git
origin:默认习惯命名
git push -u origin master:第一次推送master分支的所有内容
git push origin master:推送修改
-
克隆仓库,知道仓库的地址,使用git clone命令克隆。Git支持多种协议,但ssh协议速度最快
-
分支管理:在自己的分支干活,开发一部分完毕后再合并
HEAD指向当前分支。HEAD指向master,master指向提交
查看分支:git branch
创建分支:git branch
切换分支:git checkout 或git switch
创建并切换分支:git checkout -b 或git switch -c
合并某分支到当前分支:git merge
删除分支:git branch -d
-
无法自动合并分支时,需解决冲突。
git log --graph:看到分支合并图
合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支
fast forword合并则看不出来曾经做过合并
-
修复bug时,会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场
git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;在master分支上修复的bug,想要合并到当前dev分支,可以用
git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。 -
开发一个新feature,最好新建一个分支;如果要丢弃一个没有被合并过的分支,可以通过
git branch -D <name>强行删除。 -
多人协作:
- 查看远程库信息,使用
git remote -v; - 本地新建的分支如果不推送到远程,对其他人就是不可见的;
- 从本地推送分支,使用
git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交; - 在本地创建和远程分支对应的分支,使用
git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致; - 建立本地分支和远程分支的关联,使用
git branch --set-upstream branch-name origin/branch-name; - 从远程抓取分支,使用
git pull,如果有冲突,要先处理冲突。 - rebase操作可以把本地未push的分叉提交历史整理成直线;
- rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比
- 查看远程库信息,使用