git复习----从入门到rebase到submodules

115 阅读6分钟

这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战

Git,最先进的分布式版本控制系统. 2021年了,相信大家对git的使用已经捻熟于心了,但由于目前工作中发生冲突的几率实在太低,大多只限于git add .git commit -m " "git push origin master,不会 git rebase还经常合丢代码。

安装

下载

  1. Window:在Windows上安装,直接从Git官网上下载安装程序,接着一路默认选项即可完成安装。
  2. 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

工作区与暂存区

image.png

工作区:当前电脑里的文件状态 暂存区:git add后,会把文件放入暂存区,git commit后会提交到分支。

大家可以思考一下,如果以下操作后会发生啥。 第一次修改 -> git add -> 第二次修改 -> git commit 答案是,add的是第一次修改的,commit的自然也是第一次的,上面与下面的是一样的: 第一次修改 -> git add -> git commit -> 第二次修改

撤销修改

  1. 新增的,没有add过的,文件不受影响
  2. add过,修改后没有再add的,文件会被撤销修改
  3. 刚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

分支管理

image.png

默认只有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

image.png

合并完可以删除dev
git branch -d dev

解决冲突

image.png

若上图的情况下,想合并分支,结果又遇到的分支。可以用git status查看冲突文件,并需要进行手动修改为最新版,再addcommit。合成后的状态如下:

image.png

--no-ff模式,自动一个commit,并删除dev分支

 git merge --no-ff -m "merge with no-ff" dev

Bug分支

  1. 在分支上暂存代码
git stash
  1. 切换回主分支
git checkout master
  1. 创建专用临时分支
git checkout -b issue-101
  1. 修改并提交
git add readme.txt 
git commit -m "fix bug 101"
  1. 切回主分支,合并分支,删除临时分支
git switch master
git merge --no-ff -m "merged bug fix 101" issue-101
  1. 切换开发环境,并还原
git switch dev

git stash list//查看暂存情况

git stash pop//还原并删除暂存区

或者:
git stash apply//还原
git stash drop//删除暂存

开发新功能

  1. 新建分支进行开发
  2. 合并或删除git branch -D <name>

查看远程库信息

git remote (-v)

远程推送

git push origin dev
git push origin master

多人协作的工作模式通常是这样:

  1. 首先,可以试图用git push origin <branch-name>推送自己的修改;
  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
  3. 如果合并有冲突,则解决冲突,并在本地提交;
  4. 没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!

如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>

rebase变基

把当前分支划出来的基准,变到最新的地方

  1. 同步master上的代码
  2. 创建dev分支,切换,开发需求
  3. 切回主分支,获取最新代码
  4. 切回dev分支,git rebase master将开发的分支基准移动到最新的主分支上
  5. 切回master,git rebase dev将主分支的基础移动到dev上

Git submodule介绍与使用指南

简介

什么是 Git Submodule

Git 版本控制系统中的一个功能,允许你将一个 Git 仓库作为另一个 Git 仓库的子目录。这使得你可以跟踪两个仓库之间的关系,同时保留各自独立的提交历史。

为什么需要 Git Submodule

面对比较复杂的项目,我们有可能会将某些代码根据功能拆解成不同的子模块,以便给不同的项目引用。多个主项目对子模块有依赖关系,却又希望拥有良好的调试体验。这种情况下,通常不会把所有源码都放在同一个 Git 仓库中。

这个功能正好建立了父子模块之间的依赖关系:子模块路径子模块的远程仓库子模块的版本号。能做到代码便捷复用、组件化、独立的版本控制、简化依赖管理、减少项目大小等优点