在开发时Git的正确使用 | 青训营笔记

110 阅读6分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天

重温了Git的工作区域,基本操作,以及在团队开发中Git的正确使用

一、Git基本信息

Git --- The stupid content tracker, 傻瓜内容跟踪器。Linus Torvalds 是这样给我们介绍 Git 的。

Git 是基于 Linux内核开发的版本控制工具。与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持(wingeddevil注:这得分是用什么样的服务端,使用http协议或者git协议等不太一样。并且在push和pull的时候和服务器端还是有交互的。),使源代码的发布和交流极其方便。 Git 的速度很快,这对于诸如 Linux kernel 这样的大项目来说自然很重要。 Git 最为出色的是它的合并跟踪(merge tracing)能力。

实际上内核开发团队决定开始开发和使用 Git 来作为内核开发的版本控制系统的时候,世界开源社群的反对声音不少,最大的理由是 Git 太艰涩难懂,从 Git 的内部工作机制来说,的确是这样。但是随着开发的深入,Git 的正常使用都由一些友好的脚本命令来执行,使 Git 变得非常好用,即使是用来管理我们自己的开发项目,Git 都是一个友好,有力的工具。现在,越来越多的著名项目采用 Git 来管理项目开发.

二、Git工作区域

此图包含了 Git 的4个工作区和一些常见的操作。

image.png Workspace:工作区,就是平时进行开发改动的地方,是当前看到最新的内容,在开发的过程也就是对工作区的操作

Index / Stage:暂存区,当执行 git add 的命令后,工作区的文件就会被移入暂存区,暂存区标记了当前工作区中那些内容是被 Git 管理的,当完成某个需求或者功能后需要提交代码,第一步就是通过 git add 先提交到暂存区。

Repository:本地仓库,位于自己的电脑上,通过 git commit 提交暂存区的内容,会进入本地仓库。

Remote:远程仓库,托管代码的服务器,远程仓库的内容能够被分布在多个地点的处于协作关系的本地仓库修改,本地仓库修改完代码后通过 git push 命令同步代码到远程仓库。

一般来说Git的操作一般分为以下几步:

1.在工作区开发,添加,修改文件。
2.将修改后的文件放入暂存区。
3.将暂存区域的文件提交到本地仓库。
4.将本地仓库的修改推送到远程仓库。

三、Git基本操作

git add

添加暂存区

# 添加指定文件到暂存区
git add [file1] [file2] ...

# 添加指定目录到暂存区,包括子目录
git add [dir]

# 添加当前目录的所有文件到暂存区
git add .

git commit

代码提交

# 提交暂存区到仓库区
git commit -m [message]

# 提交暂存区的指定文件到仓库区
git commit [file1] [file2] ... -m [message]

# 提交工作区自上次 commit 之后的变化,直接到仓库区
git commit -a

# 提交时显示所有 diff 信息
git commit -v

# 使用一次新的 commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次 commit 的提交信息
git commit --amend -m [message]

# 重做上一次 commit,并包括指定文件的新变化
git commit --amend   ...

git pull

代码拉取(git pull = git fetch + git merge)

# 从远程仓库拉取代码并合并到本地,可简写为 git pull 等同于 git fetch && git merge 
git pull <远程主机名> <远程分支名>:<本地分支名>
# 使用rebase的模式进行合并
git pull --rebase <远程主机名> <远程分支名>:<本地分支名>

git fetch

与 git pull 不同的是 git fetch 操作仅仅只会拉取远程的更改,不会自动进行 merge 操作。对你当前的代码没有影响

# 获取远程仓库特定分支的更新 
git fetch <远程主机名> <分支名> 
# 获取远程仓库所有分支的更新 
git fetch --all

git branch

分支操作

# 列出所有本地分支
git branch

# 列出所有远程分支
git branch -r

# 列出所有本地分支和远程分支
git branch -a

# 新建一个分支,但依然停留在当前分支
git branch [branch-name]

# 新建一个分支,并切换到该分支
git checkout -b [branch]

# 新建一个分支,指向指定 commit
git branch [branch] [commit]

# 新建一个分支,与指定的远程分支建立追踪关系
git branch --track [branch] [remote-branch]

# 切换到指定分支,并更新工作区
git checkout [branch-name]

# 建立追踪关系,在现有分支与指定的远程分支之间
git branch --set-upstream [branch] [remote-branch]

# 合并指定分支到当前分支
git merge [branch]

# 选择一个 commit,合并进当前分支
git cherry-pick [commit]

# 删除分支
git branch -d [branch-name]

# 删除远程分支
git push origin --delete 
git branch -dr

四、Git在开发项目中使用流程

  1. 首先公司一般都有自己的gitlab仓库,为什么不用github,一是公网不安全二是无法像gitlab一样做一些定制化
  2. 新人入职后,leader一般会给你一个gitlab地址,打开并登录后你可能会发现没权限,不要慌,只有登录后gitlab后台才能搜到你的名字,这时候你让leader帮你开个仓库权限就行
  3. 有权限后,最好在本地生成好sshkey然后配置到gitlab仓库,当然不配置也行,需要在拉取代码时输入gitlab的用户名和密码
  4. 使用「git config」配置用户名和邮箱,以后提交代码时都会用这个用户名显示
  5. 已经有权限了,这时候使用 「git clone 仓库地址 本地目录地址」克隆仓库代码到本地
  6. 假设这时候你需要开发一个新功能,使用「git checkout -b 新分支名」从最新的主分支上切一个自己的分支出来开发,要记住git是提倡分支操作的
  7. 文件有三种状态,untracked(新建文件未纳入版本管理),commited(已提交),stashed(暂存的文件),对于新建的文件需要「git add 」,修改完后需要提交文件「git commit」,对于暂时不想提交的文件可以「git stash」暂存起来,可以使用「git status」查看文件状态
  8. 如果此分支不止你一个人在开发,push前需要「git pull」拉一下远程的最新代码,pull默认会跟本地代码进行merge操作,如果最终是要把代码合并到master(protected),这时候要在本地在自己分支上merge最新的master代码,若有冲突解决好再commit,最后执行「git push」把自己的分支推到远程仓库
  9. 一般比较正规的流程里,如果你想把自己开发的分支合并到master主分支,需要提merge request,leader审批后才会进行合并