Git 的正确使用姿势与最佳实践 | 青训营
前言
对于我们"敲代码的"来讲,**在做一些大的项目时,Git工具是必不可少的。**本篇主要讲解了Git工具的指令。
Git概述
Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 分布式相比于集中式的最大区别在于开发者可以提交到本地,每个开发者通过克隆(git clone),在本地机器上拷贝一个完整的Git仓库。
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。
Git常用命令
git clone:克隆远程代码库到本地
git add:将文件添加到暂存区
git commit:将暂存区的文件提交到本地代码库
git push:将本地代码库的提交推送到远程代码库
git pull:将远程代码库的更新下拉到本地
git branch:管理本地分支
git merge:合并分支
git status:查看当前代码库的状态
git diff:比较不同版本之间的差异
git log:查看提交历史
这其中,clone 、add、commit、push、pull 是最常用的
日常操作步骤
日常操作是这样的:
1、把代码拉到本地就用git clone,clone一次即可。
2、平时工作时写代码遵循先下拉更新、修改代码、暂存、提交、推送这几个步骤,除了修改代码以外,涉及到的命令依次是pull、add、commit、push。
3、如果产生了冲突,则需要手动处理一下冲突再暂存、提交、推送。
Git使用入门
创建仓库
创建本地仓库的方法有两种:
- 一种是创建全新的仓库:git init,会在当前目录初始化创建仓库。
- 另一种是克隆远程仓库:git clone [url]
1
准备一个文件夹“test”作为仓库目录,命令行进入该文件夹
"cd <目录名称>"指令进入目录
开始初始化项目,也可指定目录:git init [文件目录]
$ git init
Initialized empty Git repository in D:/GIT/test/.git/
注意:Git指令的执行,都需在仓库目录下。
创建完多出了一个被隐藏的 .git 目录,这就是本地仓库Git的工作场所。
2
克隆远程仓库,如在github上创建的仓库“github.com/chayixiuli/…
$ git clone https://github.com/chayixiuli/heart.git
Cloning into 'heart'...
remote: Enumerating objects: 14, done.
remote: Counting objects: 100% (14/14), done.
remote: Compressing objects: 100% (12/12), done.
remote: Total 14 (delta 2), reused 9 (delta 1), pack-reused 0
Receiving objects: 100% (14/14), 7.53 KiB | 7.53 MiB/s, done.
Resolving deltas: 100% (2/2), done.
会在当前目录下创建"heart”项目目录。
暂存区add
可以简单理解为,git add 命令就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit 就可以一次性把暂存区的所有修改提交到仓库。
git add [file1] [file2] 添加文件到暂存区,包括修改的文件、新增的文件
git add [dir] 同上,添加目录到暂存区,包括子目录
git add . 同上,添加所有修改、新增文件(未跟踪)到暂存区
git rm [file] 删除工作区文件,并且将这次删除放入暂存区
创建一个hello.txt文件并查看他的状态
执行 git add 。 暂存,在查看状态
提交commit-记录
git commit提交是以时间顺序排列被保存到数据库中的,就如游戏关卡一样,每一次提交(commit)就会产生一条记录:id + 描述 + 快照内容 。
-
commit id:根据修改的文件内容采用摘要算法(SHA1)计算出不重复的40位字符,这么长是因为Git是分布式的,要保证唯一性、完整性,一般本地指令中可以只用前几位(6)。即使多年以后,依然可通过
id
找到曾经的任何内容和变动,再也不用担心丢失了。 -
描述:针对本次提交的描述说明,建议准确填写,就跟代码中的注释一样,很重要。
-
快照:就是完整的版本文件,以对象树的结构存在仓库下
\.git\objects
目录里,这也是Git效率高的秘诀之一。git commit -m '说明' 提交变更,参数-m设置提交的描述信息,应该正确提交,不带该参数会进入说明编辑模式 git commit -a参数-a,表示直接从工作区提交到版本库,略过了git add步骤,不包括新增的文件git commit [file]提交暂存区的指定文件到仓库区git commit --amend -m使用一次新的commit,替代上一次提交,会修改commit的hash值(id)git log -n20查看日志(最近20条),不带参数-n则显示所有日志git log -n20 --oneline参数“--oneline”可以让日志输出更简洁(一行)git log -n20 --graph参数“--graph”可视化显示分支关系git log --follow [file]显示某个文件的版本历史git blame [file]以列表形式显示指定文件的修改记录git reflog查看所有可用的历史版本记录(实际是HEAD变更记录),包含被回退的记录(重要)git status查看本地仓库状态,比较常用的指令,加参数-s简洁模式
git commit -m "第一次提交"
这个命令执行后,所有被暂存的代码都会提交到本地仓库。注意:是本地仓库,不是远程仓库
推送push/拉取pull
git push、git pull 团队协作中最常用的指令,用于同步本地、服务端的更新,与他人协作。
🔸推送(push):推送本地仓库到远程仓库。
- 如果推送的更新与服务端存在冲突,则会被拒绝,
push
失败。一般是有其他人推送了代码,导致文件冲突,可以先pull
代码,在本地进行合并,然后再push
。
🔸拉取(pull):从服务端(远程)仓库更新到本地仓库。
-
git pull:拉取服务端的最新提交到本地,并与本地合并,合并过程同分支的合并。
-
git fetch:拉取服务端的最新提交到本地,不会自动合并,也不会更新工作区
git clone [git地址]从远程仓库克隆到本地(当前目录)git remote -v查看所有远程仓库,不带参数-v只显示名称git remote show [remote]显示某个远程仓库的信息git remote add [name] [url]增加一个新的远程仓库,并命名git remote rename [old] [new]修改远程仓库名称git pull [remote] [branch]取回远程仓库的变化,并与本地版本合并git pull同上,针对当前分支git fetch [remote]获取远程仓库的所有变动到本地仓库,不会自动合并!需要手动合并git push推送当前分支到远程仓库git push [remote] [branch]推送本地当前分支到远程仓库的指定分支git push [remote] --force/-f强行推送当前分支到远程仓库,即使有冲突,⚠️很危险!git push [remote] --all推送所有分支到远程仓库git push –u参数–u表示与远程分支建立关联,第一次执行的时候用,后面就不需要了git remote rm [remote-name]删除远程仓库git pull --rebase使用rebase的模式进行合并
Git利器-分支
分支是从主线分离出去的“副本”,分支就像是平行宇宙,可独立发展,独立编辑、提交,也可以和其他分支合并。分支是Git的核心必杀利器之一,分支创建、切换、删除都非常快,他非常的轻量。所以,早建分支!多用分支!
比如有一个项目团队,准备10月份发布新版本,要新开发一堆黑科技功能,占领市场。你和小伙伴“小美”一起负责开发一个新功能A,开发周期2周,在这两周你们的代码不能影响其他人,不影响主分支。这个时候就可以为这个新功能创建一个分支,你们两在这个分支上干活,2周后代码开发完了、测试通过,就可以合并进要发版的开发分支了。安全、高效,不影响其他人工作,完美!
git branch列出所有本地分支,加参数-v显示详细列表,下同git branch -r列出所有远程分支git branch -a列出所有本地分支和远程分支,用不同颜色区分git branch [branch-name]新建一个分支,但依然停留在当前分支git branch -d dev删除dev分支,-D(大写)强制删除git checkout -b dev从当前分支创建并切换到dev分支git checkout -b feature1 dev从本地dev分支代码创建一个 feature1分支,并切换到新分支git branch [branch] [commit]新建一个分支,指向指定commit idgit branch --track [branch] [remote-branch]新建一个分支,与指定的远程分支建立关联git checkout -b hotfix remote hotfix从远端remote的hotfix分支创建本地hotfix分支git branch --set-upstream [branch] [remote-branch]在现有分支与指定的远程分支之间建立跟踪关联:git branch --set-upstream hotfix remote/hotfixgit checkout [branch-name]切换到指定分支,并更新工作区git checkout .撤销工作区的(未暂存)修改,把暂存区恢复到工作区。git checkout HEAD .撤销工作区、暂存区的修改,用HEAD指向的当前分支最新版本替换git merge [branch]合并指定分支到当前分支git merge --no-ff dev合并dev分支到当前分支,参数--no-ff禁用快速合并模式git push origin --delete [branch-name]删除远程分支git rebase master将当前分支变基合并到master分支switch:新的分支切换指令切换功能和checkout一样,switch只单纯的用于切换git switch master切换到已有的master分支git switch -c dev创建并切换到新的dev分支
关于 checkout 指令:checkout是Git的底层指令,比较常用,也比较危险,他会重写工作区。支持的功能比较多,能撤销修改,能切换分支,这也导致了这个指令比较复杂。在Git 2.23版本以后,增加了git switch、git reset指令。git switch:专门用来实现分支切换。git reset:专门用来实现本地修改的撤销,
总结
Git的使用。它可以帮助开发人员跟踪和管理源代码,并允许多人协作开发项目。Git具有许多优点,本文所介绍的使用方法是在这次学习中常用的使用方法,在和小伙伴们一起开发项目中,合并分支和处理冲突的情况基本没有遇见。就没有花费很多时间在这方面。更多的在学习和解决项目中遇到的问题。
感谢这次青训营给我这次的学习机会,确实给了我很大的帮助。