这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战
Git,最先进的分布式版本控制系统. 2021年了,相信大家对git的使用已经捻熟于心了,但由于目前工作中发生冲突的几率实在太低,大多只限于
git add .,git commit -m " ",git push origin master,不会git rebase还经常合丢代码。
安装
下载
- Window:在Windows上安装,直接从Git官网上下载安装程序,接着一路默认选项即可完成安装。
- Mac OS:官方的话AppStore安装先Xcode,运行Xcode,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就可以完成安装了。
配置
完成安装后,可以顺带配置一下用户名和邮箱
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
本地仓库
创建一个仓库
git init
此时文件夹会出现一个.git的隐藏文件,代表该文件夹已被git托管。
添加文件到仓库
git add <file>
文件夹中手动新增的文件并不会被git仓库托管,需要使用git add命令将文件托管到仓库中。
git add常用的有一下三个命令:
· git add . 提交新文件(new)和被修改(modified)文件,不包括被删除(deleted)文件
· git add -u 提交被修改(modified)和被删除(deleted)文件,不包括新文件(new)
· git add -A 提交所有变化
提交本次修改
git commit -m <message>
提交本次修改,留下记录,后续可恢复。
查看信息
查看状态
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
查看diff
$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
index ea786ff..abfe3d3 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1 +1,2 @@
+readme
readme
\ No newline at end of file
时光回溯
回退
先查看版本信息log
$ git log
commit 0ca005aa6ea7ad90fc88de08e5f0890ffaa42004 (HEAD -> master)
Author: WYX <450944397@qq.com>
Date: Tue Aug 17 23:32:58 2021 +0800
second modify
commit 337c21018dafcd38ee670dcf51383c1a6147e76b
Author: WYX <450944397@qq.com>
Date: Tue Aug 17 23:28:06 2021 +0800
first modify
-----------------------------------------------------------------------------------------
$ git log --pretty=oneline
0ca005aa6ea7ad90fc88de08e5f0890ffaa42004 (HEAD -> master) second modify
337c21018dafcd38ee670dcf51383c1a6147e76b first modify
选择版本,选上一个版本的话可直接用HEAD^。
$ git reset --hard HEAD^
HEAD is now at e475afc add distributed
-----------------------------------------------------------------------------------------
特定版本可用log前几位
$ git reset --hard 1094a
HEAD is now at 83b0afe append GPL
工作区与暂存区
工作区:当前电脑里的文件状态
暂存区:git add后,会把文件放入暂存区,git commit后会提交到分支。
大家可以思考一下,如果以下操作后会发生啥。
第一次修改 -> git add -> 第二次修改 -> git commit
答案是,add的是第一次修改的,commit的自然也是第一次的,上面与下面的是一样的:
第一次修改 -> git add -> git commit -> 第二次修改
撤销修改
- 新增的,没有add过的,文件不受影响
- add过,修改后没有再add的,文件会被撤销修改
- 刚add后,又修改的,文件会撤销回add的状态
git checkout -- readme.txt
git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout命令。
删除文件
不是把文件从电脑里删了,而是在git仓库里删了,不再管理该文件的意思。
$ git rm test.txt
rm 'test.txt'
$ git commit -m "remove test.txt"
[master d46f35e] remove test.txt
1 file changed, 1 deletion(-)
delete mode 100644 test.txt
远程仓库
在网站中添加公钥,再新建项目后运行:
git remote add origin git@xxx.com/learngit.git
远程仓库的名字为origin
git clone 地址
git push origin master
分支管理
默认只有master,HEAD指针会向master。 可以创建dev分支,并修改HEAD的指向,来完成切换
查看分支
git branch
创建分支
两种创建并切换
git checkout -b dev
git switch -c dev
等价于
git branch <name>//创建
git checkout dev//切换
git switch dev//切换
合并分支
原地合并
git merge dev
合并完可以删除dev
git branch -d dev
解决冲突
若上图的情况下,想合并分支,结果又遇到的分支。可以用git status查看冲突文件,并需要进行手动修改为最新版,再add与commit。合成后的状态如下:
--no-ff模式,自动一个commit,并删除dev分支
git merge --no-ff -m "merge with no-ff" dev
Bug分支
- 在分支上暂存代码
git stash
- 切换回主分支
git checkout master
- 创建专用临时分支
git checkout -b issue-101
- 修改并提交
git add readme.txt
git commit -m "fix bug 101"
- 切回主分支,合并分支,删除临时分支
git switch master
git merge --no-ff -m "merged bug fix 101" issue-101
- 切换开发环境,并还原
git switch dev
git stash list//查看暂存情况
git stash pop//还原并删除暂存区
或者:
git stash apply//还原
git stash drop//删除暂存
开发新功能
- 新建分支进行开发
- 合并或删除
git branch -D <name>
查看远程库信息
git remote (-v)
远程推送
git push origin dev
git push origin master
多人协作的工作模式通常是这样:
- 首先,可以试图用
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>。
rebase变基
把当前分支划出来的基准,变到最新的地方
- 同步master上的代码
- 创建dev分支,切换,开发需求
- 切回主分支,获取最新代码
- 切回dev分支,
git rebase master将开发的分支基准移动到最新的主分支上 - 切回master,
git rebase dev将主分支的基础移动到dev上
Git submodule介绍与使用指南
简介
什么是 Git Submodule
Git 版本控制系统中的一个功能,允许你将一个 Git 仓库作为另一个 Git 仓库的子目录。这使得你可以跟踪两个仓库之间的关系,同时保留各自独立的提交历史。
为什么需要 Git Submodule
面对比较复杂的项目,我们有可能会将某些代码根据功能拆解成不同的子模块,以便给不同的项目引用。多个主项目对子模块有依赖关系,却又希望拥有良好的调试体验。这种情况下,通常不会把所有源码都放在同一个 Git 仓库中。
这个功能正好建立了父子模块之间的依赖关系:子模块路径、子模块的远程仓库、子模块的版本号。能做到代码便捷复用、组件化、独立的版本控制、简化依赖管理、减少项目大小等优点