Git学习笔记

Git 是一种分布式版本控制系统,用于跟踪和管理代码和其他文件的更改。它最常用于软件开发过程中,帮助多个开发者协同工作,并在项目中进行版本控制。Git 可以记录文件的每次修改,并允许开发者在不同的时间点查看或恢复特定的版本。

Git 的基本概念:版本库,仓库,repository

Git 的操作流程如下图:

创建版本库

pwd 命令显示当前目录

git init 命令把目录变成Git可以管理的仓库,随后目录中生成 .git 目录,不要修改

ls -ah 命令查看包括隐藏的文件

把文件添加到仓库

版本控制系统只可以跟踪文本文件的改动,而无法得知图片视频等的改动内容,Windows 的 word 文档也不可以。如果要使用版本控制软件,就要用纯文本方式(UTF-8)编写文件。

git add [file] 命令将文件加入暂存区

UNIX 的哲学:“没有消息就是好消息”

git commit -m [message] 命令把文件提交到仓库,-m后面跟本次提交的说明

提交成功后,提示 1 file changed:一个文件改动了;2 insertions:插入两行内容可以多次add不同文件,再一次commit提交上去

时光机穿梭

git status 命令查看仓库当前的状态

git diff 命令查看修改的内容

版本回退

git log 显示从最近到最远的提交日志,简化信息,可以在后面加–pretty=oneline

显示出的十六进制数字是版本号commit ID

git reset --hard HEAD^ 回退到上一个版本,上上个版本就是HEAD^^,上10个版本就是HEAD~10

回到未来版本:git reset --hard [commit ID],版本号只需要前数位

版本回退其实就是HEAD指针的指向改变了

git reflog 查看每一次命令,可以得知任何版本的版本号

工作区和暂存区

工作区:在电脑里可以看见的目录

版本库:.git隐藏目录中有称为stage(或者index)的暂存区

git add实际上是把文件修改添加到暂存区

git commit是把暂存区的内容提交到当前master分支

全部是提交以后,暂存区就是干净的了

管理修改

Git追踪管理的是修改

在使用git add以后再进行的修改,不会被git commit命令提交至仓库

git diff HEAD -- [file] 命令可以查看工作区和版本库里最新版本的区别

撤销修改

git checkout -- [file] 命令撤销在工作区的全部修改

  • 文件修改后若没有保存到暂存区,就变成和仓库一样的状态

  • 文件保存到暂存区后又有修改,就变成和添加到暂存区一样的状态

git reset HEAD [file] 命令可以撤销暂存区的修改,重新放回工作区

删除文件

rm [file] 命令在工作区删除文件

git rm [file] 并且 git commit -m [message] 在仓库中删除文件

如果删错,但是仓库中还有文件,就用 git checkout -- [file] 命令恢复到最新版本,所以这个命令的实质是用仓库中的版本替换工作区的版本。

远程仓库

在GitHub创建一个新的仓库,在本地对应的库中输入命令:

1
git remote add origin git@github.com:Avicii4/[file].git

远程库为空,用命令git push -u orgin master可以将本地master分支的内容更新至远程库,还可以联系本地库和远程库。以后在本地提交后,用命令git push origin master更新远程库。

从远程库克隆

在知道仓库地址后,使用git clone [git@github.com](mailto:git@github.com):Avicii4/[file].git命令克隆到本地

分支管理

master分支指向最新的提交,再用HEAD指向master,即指向工作分支。

查看分支:git branch

创建分支:git branch [name]

切换分支:git checkout [name]

创建+切换分支:git chenckout -b [name]

合并某分支到当前分支:git merge [name]

删除分支:git branch -d [name]

解决冲突

打开文件解决冲突后再提交,再合并分支

git log --graph命令可以查看合并分支图

分支管理策略

通常,Git会用 Fast forward模式合并分支,但是合并会丢失分支信息。

使用git merge --no-ff -m "[message]" [branchname]命令禁用Fast forward模式。

因为这种合并会创建一个新的commit,所以要加上-m参数。

master分支应该保持稳定,不能在其上工作,而要在dev分支工作。

Bug分支

git stash命令保存目前没有完成的工作

git stash list命令查看之前的工作现场

git stash pop命令恢复现场并删除stash内容

多次使用stash后用git stash apply stash@{0}恢复

使用之前新文件需要被add至stage中,修改旧文件不需要

Feature分支

添加新功能时新建一个feature分支,在上面开发再合并

如果要丢弃一个没有被合并的分支,使用命令git branch -D [name]强制删除

多人协作

查看远程库信息,用git remote,更详细的,用git renote -v,显示了可以抓取和推送的origin的地址

推送分支,如:git push origin mastergit push origin dev

本地新建的分支如果不推送到远程,对其他人就是不可见的

从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交

在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致

建立本地分支和远程分支的关联,用 git branch --set-upstream branch-name origin/branch-name

Rebase

git rebase命令将提交修改成一条直线,但是本地的分叉提交会被修改

标签管理

打一个新标签:git tag v1.0

默认标签打在最新的commit上,要在以前的提交上打标签,先找到历史commit ID,git log --pretty=oneline --abbrev-commit,再使用 git tag [tagname] [commitid]

git show [tagname]查看标签信息

git tag -a [tagname] -m [message]添加标签信息

删除标签:git tag -d [tagname]

推送某个标签到远程:git push origin [tagname]

一次性全部推送:git push origin --tags

删除远程标签,先本地删除:git tag -d [tagname],再远程删除:git push origin :refs/tags/[tagname]

使用GitHub

在GitHub上Fork一个开源项目,然后从自己的账号下克隆仓库:git clone [git@github.com](mailto:git@github.com):[address]

忽略特殊文件

删除git中每次都要显示的多余信息

https://github.com/github/gitignore 提供了所有配置文件,可以自由组合

如果以后有文件被.gitignore忽略,使用git add -f [file]强制添加

检查.gitignore,用git check-ignore -v [file],可知哪一行忽略了该文件,进而修改