git随笔

129 阅读7分钟

前言

放假咯 放假咯 今天可以回家过年咯 那就祝各位虎年大吉啦!

年前的一篇随笔 想到啥写啥咯。

一个git沙盒随便玩

learngitbranching.js.org/?locale=zh_…

安装git

那么简单 肯定都会的啦 直接上链接。

www.git-scm.com/book/zh/v2/…

配置user信息

git config --local/global/system user.name 'xxx'

git config --local/global/system user.email 'xxx'

local - 只对某个仓库有效 默认值

global - 对当前用户所有仓库有效

system - 对系统所有登录的用户有效

创建git文件(git init)

image.png

image.png

Git 基本操作

git add (添加文件到暂存区)

git add xxx (添加某个文件到暂存区,后面可以跟多个文件,以空格分开)

git add . (添加当前更改的所有文件到暂存区)

git commit

git commit -m "xxx" (提交暂存的更改,并记录备注信息)

git commit -am (等同于 git add . && git commit -m)

git commit --amend (对最近一次的提交的信息进行修改,此操作会修改commit的hash值)

git pull

git pull <远程主机名> (从远程仓库拉取代码并合并到本地,git pull 等同于 git fetch && git merge )

git pull --rebase <远程主机名> (使用rebase的模式进行合并)

git fetch

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

git branch

git branch(查看本地分支)

git branch -r(查看远程分支)

git branch -a(查看本地和远程分支)

git branch new_branch(创建分支)

git checkout new_branch(切换分支)

git branch -D 分支名(删除不需要的分支)

git branch -m new_branch another_name(重命名分支)

文件重命名(git rm 文件名 文件名)

image.png

Git移动操作(git mv)

git mv index.html src/

查看版本历史(git log)

git log --oneline(一行展示)

git log -n2 --oneline(一行展示最近两条)

git log --oneline --all(一行展示所有分支)

git log --oneline --all -n2(一行展示所有分支的最近两个)

git log --oneline --all -n2 --graph(一行图形化展示所有分支的最近两个)

image.png

通过图形界面工具查看版本历史(gitk)

image.png

commit tree blob 三个对象之间关系

一个commit对应一颗树(tree)

树是当前commit那个点项目所有文件的快照

大树里面嵌套小树/blob 小树展开最后叶子节点就是文件

blob表示具体的某一个文件

git cat-file -p 版本号

image.png

git remote命令

命令管理一组跟踪的存储库

git remote -v

git remote add

git remote remove name

git reset

用于将当前HEAD复位到指定状态。一般用于撤消之前的一些操作(如:git add,git commit等)。

用来设置分支的头部指向,移动 HEAD 以及它所指向的 branch,当进行了一系列的提交之后,忽然发现最近的几次提交有问题,想从提交记录中删除,这是就会用到 git reset 命令,这个命令后面跟 commit id,表示当前分支回退到这个commit id 对应的状态,之后的日志记录被删除,工作区中的文件状态根据参数的不同会恢复到不同的状态。

git reset -- soft:保留工作目录的内容,并把因为保留工作目录内容所带来的新的文件差异放进暂存区。

git reset --mixed: 默认选项,工作目录的修改、暂存区的内容以及由 reset所导致的新的文件差异,都会被放进工作目录。

git reset --hard: 重置stage区和工作目录,没有commit的修改会被全部擦掉(无论暂存区还是工作区)。

git revert

它和reset差不多意思回滚某次的提交,此操作不会修改原本的提交记录,而是会新增一条提交记录来抵消某次操作。

区别在于:

git revert会新建一条 commit 信息,来撤回之前的修改。

git reset会直接将提交记录退回到指定的 commit 上。

git revert commitId

git revert commitId -m(针对 merge 的 commit)

git revert commitId1 commitId2 ...(回滚多次的提交,这是一个前开后闭区间,即不包括 commitId1,但包括commitId2 。)

git restore

git restore --staged 文件名: 将文件从暂存区撤出,但不会撤销工作区文件的更改(即: git status 提示的 被修改且被加入暂存区的内容会被撤销,工作区文件的更改不会变)

git restore 文件名 :将不在暂存区的文件撤销更改 (即: git status 提示的被修改但未被加入暂存区的内容,会被撤销)

git rebase

rebase 翻译为变基,他的作用和 merge 相似,用于把一个分支的修改合并到当前分支上

Rebase 使你的提交树变得很干净,所有的提交都在一条线上。

一些开发人员喜欢保留提交历史,因此更偏爱 merge。

另外,在解决冲突的时候,用merge只需要解决一次冲突即可,而用rebase的时候,需要依次解决每次的冲突,才可以提交。

而有些人可能更喜欢干净的提交树,于是偏爱 rebase。仁者见仁,智者见智。

image.png

image.png

image.png

特别注意:以下操作在自己的分支做变更还未集成到团队分支上,因为这种操作会修改团队分支的历史记录。

修改老旧commit的Message(rebase -r)

image.png

image.png

image.png

把连续的commit整理成一个(rebase -s)

image.png

image.png

image.png

image.png

把几个commit整理成一个(rebase -s)

image.png

image.png

image.png

image.png

image.png

git cherry-pick

可理解为挑拣几条commi,作为一个新的提交引入到你当前分支上

git cherry-pick c2 c1 当前分支添加commit节点

image.png

比较两个commit的差异(git diff)

比较HEAD和HEAD文件的差异(git diff HEAD HEAD^^)

image.png

看不同提交的指定文件的差异(git diff commitID commitID)

image.png

image.png

比较暂存区和HEAD所含文件的差异(git diff --cached)

image.png

比较工作区和暂存区所含文件的差异(git diff -- 文件名 文件名 文件名...)

image.png

Git隐藏(Stash)操作 - 开发中临时加塞紧急任务(git stash)

git stash(把本地的改动暂存起来)

git stash list(查看 stash 有哪些存储)

git stash apply(将操作返回到工作区中,stash列表堆栈信息不清除,可反复使用)

git stash pop(将操作返回到工作区中,stash列表堆栈信息清除)

git stash clear(删除所有缓存的 stash)

image.png

问题场景/些许操作

修改最新commit的message(git commit --amend)

image.png

让暂存区恢复成和HEAD一样(git reset HEAD)

image.png

取消暂存区部分文件修改(git reset HEAD -- 文件名 文件名...)

让工作区的文件恢复成和暂存区一样(git checkout -- 文件名)

image.png

消除最近几次提交(git reset --hard commitID)

image.png

将本地仓库同步到GitHub

1.github创建项目

2.git remote add origin 项目git地址

3.git push -u origin 分支名

不同人修改了不同文件如何处理

解1:git fetch git merge 远端分支/id

解2:git pull(相当于上面两步)

不同人修改了同文件不同区域

解1:git fetch git merge 远端分支/id

解2:git pull(相当于上面两步)

不同人修改了同文件相同区域

git pull

手动解决冲突

git commit

git push

一人变更了文件名和一人修改文件内容提交冲突

git pull

双方同时都修改了文件名提交冲突

git pull

git status

手动解决冲突

git rm 文件(删除协商不想要的文件)

git add 文件(最终协商确定的文件)

git commit

git push

git checkout HEAD^ 向上移动一个提交记录

image.png

git checkout HEAD^^ 向上移动两个提交记录

git checkout HEAD~2 向上移动两个提交记录

image.png

git branch -f main HEAD~3 将 main 分支强制指向 HEAD 的第 3 级父提交

image.png

git rebase -i main 当前分支移动多少到main上

image.png

git rebase dev main 将main指向dev合并

image.png

git rebase -i HEAD~2

image.png