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 master
或git 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]
,可知哪一行忽略了该文件,进而修改