Git 的正确使用姿势与最佳实践:团队协作和版本控制的最佳实践 | 青训营

70 阅读6分钟

Git 的正确使用姿势与最佳实践:团队协作和版本控制的最佳实践;

  1. Git是目前世界上最先进的分布式版本控制系统,Git是用C语言开发的

  2. 集中式版本控制系统:版本库是集中存放在中央服务器的,使用时,先从中央服务器取得最新的版本,使用后,再把内容推给中央服务器。缺点:需要联网才能工作;如果中央服务器出了问题,具有很大风险

    分布式版本控制系统:没有中央服务器,每个电脑上都是一个完整的版本库。实际使用中,分布式版本控制系统通常也有一台充当中央服务器的电脑,利于交换修改。

  3. 目前,Git在Linux、Unix、Mac和Windows几大平台上正常运行

  4. 版本库又名仓库(repository),其中所有的文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以还原。

    创建一个版本库:创建一个空目录;通过git init命令把这个目录变成Git可以管理的仓库;这个目录默认隐藏,用ls -ah命令就可以看见

    注意:所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等;对图片、视频这些二进制文件,版本控制系统可以管理,但是没法跟踪文件的变化。文本编码建议使用标准的UTF-8编码。

    对于windows,不要使用自带的记事本编辑任何文本文件,建议使用Visual Studio Code代替记事本。

  5. 使用:

    编写一个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命令查看当前目录的文件,看看文件是否存在,或者是否写错了文件名。

  6. 命令:

    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

  7. 工作区(Working Directory):即电脑能看见的目录

    版本库(Repository):工作区有一个隐藏目录.git,即Git的版本库。存储了很多东西,最重要的是stage(或叫index)的暂存区,还有Git自动创建的第一个分支master,及指向master的指针HEAD

  8. Git比其他版本控制系统设计优秀原因:Git跟踪并管理的是修改,而非文件。

  9. 本地Git仓库与GitHub仓库之间的传输是通过SSH加密的

  10. 要关联一个远程库,使用命令:

    git remote add origin git @server-name:path/repo-name.git

    origin:默认习惯命名

    git push -u origin master:第一次推送master分支的所有内容

    git push origin master:推送修改

  11. 克隆仓库,知道仓库的地址,使用git clone命令克隆。Git支持多种协议,但ssh协议速度最快

  12. 分支管理:在自己的分支干活,开发一部分完毕后再合并

    HEAD指向当前分支。HEAD指向master,master指向提交

    查看分支:git branch

    创建分支:git branch

    切换分支:git checkout 或git switch

    创建并切换分支:git checkout -b 或git switch -c

    合并某分支到当前分支:git merge

    删除分支:git branch -d

  13. 无法自动合并分支时,需解决冲突。

    git log --graph:看到分支合并图

    合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支

    ​ fast forword合并则看不出来曾经做过合并

  14. 修复bug时,会通过创建新的bug分支进行修复,然后合并,最后删除;

    当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;

    在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。

  15. 开发一个新feature,最好新建一个分支;如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。

  16. 多人协作:

    • 查看远程库信息,使用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的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比