Git

Git

本文基于https://liaoxuefeng.com/books/git/what-is-git/svn-vs-git/index.html
Git Cheat Sheethttps://liaoxuefeng.com/books/git/conclusion/git-cheat-sheet.pdf

创建版本库

git init把这个目录变成Git可以管理的仓库
git add file添加文件到库
git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容。

时光机穿梭

git status命令可以让我们时刻掌握仓库当前的状态
git diff顾名思义就是查看difference,显示的格式正是Unix通用的diff格式
提交新文件或者修改仍然使用git add file

版本回退

git log命令显示从最近到最远的提交日志,加上--pretty=oneline参数可以使输出更简化。
在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写成HEAD~100
git reset--hard会回退到上个版本的已提交状态,而--soft会回退到上个版本的未提交状态,--mixed会回退到上个版本已添加但未提交的状态。
例如:git reset --hard HEAD^
如果要退回现在的版本,只要上面的命令行窗口还没有被关掉,找到HEAD版本的找到那个append GPLcommit id是什么,使用git reset --hard <commit id>即可,版本号没必要写全,前几位就可以了。
如果已经关闭了命令行窗口,则要通过git reflog(用来记录你的每一次命令)来查看当时的commit id。

工作区和暂存区

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

管理修改

提交后,用git diff HEAD -- readme.txt命令可以查看工作区和版本库里面最新版本的区别。

撤销修改

git checkout -- file可以丢弃工作区的修改(git restore file也可以)
这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
it reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区

删除文件

git rm删掉,并且git commit:从版本库中删除该文件
先手动删除文件,然后使用git rm <file>git add <file>效果是一样的。
把误删的文件恢复到最新版本:git checkout -- file

远程仓库

添加远程库

远程库的名字就是origin
以后只要本地作了提交,就可以通过命令git push origin main把本地main分支的最新修改推送至github。

从远程库克隆

git clone git@github.com:BlakeHansen130/repositoy-name.git
Git支持多种协议,包括https,但ssh协议速度最快。

分支管理

创建与合并分支

checkout

git checkout -b dev-b表示创建并切换,相当于以下两条命令:

1
2
git branch dev
git checkout dev # 切换到dev分支

git branch命令查看当前分支:当前分支前面会标一个*号。
把dev分支的工作成果合并到main上:git merge dev用于合并指定分支到当前分支。
git branch -d dev删除dev分支。

switch

git switch -c dev创建并切换到新的分支
git switch main切换到已有的分支

解决冲突

Git用<<<<<<<=======>>>>>>>标记出不同分支的内容
git log --graph --pretty=oneline --abbrev-commit可以看到分支的合并情况。
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。

分支管理策略

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

Bug分支

git stash:把当前工作现场“储藏”起来,等以后恢复现场后继续工作。
git stash list查看工作现场:
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了。
你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:git stash apply stash@{0}

如何在另一分支上修改同样的bug?

git cherry-pick <bug-fixed commit id>能复制一个特定的commit到当前分支

Feature分支

每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
git branch -D <name>强行丢弃没有合并过的分支。

多人协作

git remote查看远程库信息
git remote -v显示更详细的信息,上面显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址。
从远程库clone时,默认情况下,只能看到本地的master分支。
要在dev分支上开发,就必须创建远程origindev分支到本地,用这个命令创建本地dev分支:git checkout -b dev origin/dev
有冲突时,先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送。
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,即没有关联,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>

rebase

  • rebase操作可以把本地未push的分叉提交历史整理成直线;
  • rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
    git rebase

标签管理

创建标签

先切换到需要打标签的分支上,再git tag <name>即可对最新的commit打标签。如果要对历史commit打标签,则git tag <name> <commit id>
git tag可以查看所有标签,标签不是按时间顺序列出,而是按字母排序的。
git show <name>可以查看标签信息。
还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:
例如:git tag -a v0.1 -m "version 0.1 released" 1094adb
标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。

操作标签

git tag -d <name>删除标签。创建的标签都只存储在本地,不会自动推送到远程。
git push origin <name>推送标签。一次性推送全部:git push origin --tags
如果标签已经推送到远程,先从本地删除git tag -d <name>,再从远程删除git push origin :refs/tags/<name>

使用GitHub

点“Fork”就在自己的账号下克隆了一个仓库,然后,从自己的账号下clone,这样才能推送修改。如果你希望官方库能接受你的修改,你就可以在GitHub上发起一个pull request。

自定义Git

忽略特殊文件

在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
检验.gitignore的标准是git status命令是不是说working directory clean
如果想强制添加.ignore文件中的文件到Git,那么git add -f file;也可以用git check-ignore来检查哪行规则忽略了该文件。
把指定文件排除在.gitignore规则外的写法就是!+文件名,所以,只需把例外文件添加进去即可。
在线生成.gitignore文件并直接下载:https://michaelliao.github.io/gitignore-online-generator/
一个Git仓库也可以有多个.gitignore文件,.gitignore文件放在哪个目录下,就对哪个目录(包括子目录)起作用。

配置别名

配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。每个仓库的Git配置文件都放在.git/config文件中,当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中。


Git
https://blakehansen130.github.io/2024/10/22/Git/
发布于
2024年10月22日
许可协议