Git学习笔记—操作篇

76 阅读6分钟

学习了Git教程 - 廖雪峰的官方网站,对于内容进行了一些简单的梳理,供自己复习使用,当然有些地方不是很完善,不对的地方欢迎批评指正,接下来会写原理篇~

Git是什么

版本库管理方式的分类:

集中式:版本库集中存放在中央服务器,最大的问题是必须联网才能工作

分布式:每个人电脑上都有完整的版本库

版本回退

git log

git log --pretty=oneline

git log **--**graph ****可以看到合并分支图

HEAD 表示当前提交 => d44ad...

HEAD^ 表示上一个版本

HEAD^^ 表示上上个版本

如果我们想回退到某个版本 git reset --hard HEAD^

--hard参数 => 回退到上个版本的已提交状态

--soft => 回退到上个版本未提交的状态

--mixed => 回退到上个版本已添加但未提交的状态

现在我们打印git log,可以看到提交历史变成了当前head以及之后的部门,如果我们想再回到之前提交的记录,那么怎么办呢?git reset --hard d44ad

如果你回退到某个版本,但是找不到之前提交的commitId,那么怎么办呢?

使用指令git reflog,它记录了我们的每一次命令:

工作区和暂存区

工作区有个隐藏的目录.git,这个不算工作区,而是git的版本库

版本库分为不同的区, 分为stage(或者叫index)的暂存区

所以,git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。

管理修改

git管理的不是文件,而是修改

在我们执行不同操作的时候,可以看到git status输出的内容也是不同的

撤销修改

image.png

暂时无法在飞书文档外展示此内容

删除修改

如果commit了一个文件到版本库,但是在工作区中删除了,这时git status查看状态是这样的:

这种情况下:

  1. 从版本库中删除该文件
git rm test.txt
git commit -m "remove test.txt"

2. 如果是误删的情况,想用版本库中的替换工作区,也可以很轻松地把误删的文件恢复到最新版本

git checkout -- test.txt

注意:从来没被添加到版本库就被删除的文件,是无法恢复的!

rm test.txt (只本地文件,不删版本库) 
git rm --cached test.txt (只删除版本库,不删本地文件)
git rm test.txt (都删除) 

远程库

远程仓库

  1. 当本地已经有仓库,需要和远程的仓库进行关联:
/*添加远程仓库*/
git remote add origin xxx
eg: git remote add origin git@server-name:path/repo-name.git

/*查看远程仓库*/
git remote -v

/*删除远程库*/
git remote rm <name>
eg: git remote rm origin

2. 当本地没有仓库,clone远程的仓库进行开发

git clone git@github.com:michaelliao/gitskills.git

推送代码到远程

/* 第1次 */
git push -u origin master
// 1.把本地分支master推送到远程origin master分支
// 2.把本地的master分支和远程的master分支关联起来
(在以后的推送或拉取的时候可以简化命令)

/* 第n次 */
git push origin master

分支管理

创建与合并分支

在这之前我们的分支只有一个就是master分支,master指向一次次提交,但是HEAD严格来说指向的是master分支

/*创建新的分支*/  => 从哪个分支上创建新的分支
git checkout -b dev
git switch -c dev
+ git push -u origin master(跟踪远程同名分支[目前还不存在])

/*切换分支*/
git checkout master
git switch master


/*查看当前分支*/
git branch

/*删除本地某个分支*/
git branch -d dev
git branch -D dev(-D强制删除一个没有被合并过的分支)

在master分支上拉了一个dev分支 git checkout -b dev

在dev分支上做了一些变更,然后commit, 之后切到master分支,然后merge dev分支上的内容

* git checkout -b dev
  git add ... git commit 
* git checkout master
* git merge dev

注意这里的:Fast-forward信息提示我们这次合并是 "快进模式" (直接把master指向dev当前提交)

Tips: 如果你的主分支(如 main)和功能分支(如 feature-branch)之间没有其他提交,也就是说 main 落后于 feature-branch,Git 就直接把 main 指向 feature-branch 的最新提交。

没有产生一个新的合并提交(merge commit), 看起来像是这个分支从没分过一样,历史是线性的。

解决冲突

分支管理策略

不使用 Fast forward 模式,merge之后如下:

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

普通合并(非快进合并,使用 --no-ff

即使可以快进,Git 也会强制创建一个合并提交,把两个分支的工作合成一个新提交。

合并历史中会明确留下分支合并的记录。

Bug分支

如果临时需要修复Bug,如何把当前的现场存储起来呢?

/*可以把当前工作现场"储存"起来,等以后恢复现场后继续工作*/
git stash
(注意只管理add之后的文件,存的是被追踪的文件)

git stash -u 
(未追踪文件也存起来)
/*查看当前储存的内容*/
git stash list

/*恢复储存的内容*/
git stash apply "stash@{ 0 }" 
(恢复的同时不会把stash的内容也删除了,需要 git stash drop 来删除)
git stash pop 
(恢复的同时把stash的内容也删除了)

现在新建了一个bug分支修复了问题,并且同步到了master分支,那么如何同步到dev分支呢?

使用 git cherry-pick [commitId] 同步修改的内容

多人协作

基于远程已经存在的分支创建新的分支

/*拉取最新的远程仓库的信息*/
git fetch 

/*基于远程的分支新建本地分支,会将本地和远程分支相互关联*/
git checkout -b dev origin/dev 

当你在分支的分支上开发完成之后,准备合dev分支,遇到冲突的时候:

1. git pull (最新的提交从origin/dev上抓下来)
如果失败:
git branch --set-upstream-to=origin/dev dev(设置track关系)
git pull
2. merge本地开发分支,在本地合并,解决冲突
3. 重新推送到dev分支

Rebase

目前还是不太理解

之前遇到过提交处于变基中,一直解决不了(@todo)

标签管理

Git的标签是版本库的快照,其实就是指向某个commit的指针

创建标签

/*打一个标签*/
git tag <tagname>
/*对于某个历史提交打标签*/
git tag <tagname> <commitId>
/*指定标签信息*/
git tag -a <tagname> -m "blablabla..."

/*查看所有的标签*/
git tag

/*查看某个标签具体的信息*/
git show <name>

标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。

操作标签

/*删除某个本地标签*/
git tag -d <tagname>

/*推送某个标签到远程*/
git push origin <tagname>
git push origin --tags

/*删除某个远程标签*/
git tag -d <tagname>
git push origin :refs/tags/<tagname>

自定义Git

忽略特殊文件

配置别名

git config --global alias.st status
git config --global alias.co checkout

/*设置git lg别名并且自定义格式*/
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

注意:

  1. 当前仓库的git配置信息我们直接可以在 当前仓库 .git/config 下面找到

  2. 查看当前用户的全局配置 git config --global --list 比如配置别名只能在全局配置中查看

  3. 查看系统级别配置 git config --system --list