Git命令学习笔记
参考廖雪峰的Git教程网站进行学习(https://www.liaoxuefeng.com/wiki/896043488029600)
安装
$ sudo apt-get install git
创建库
建立空仓库
$ git init
用ls -ah
查看隐藏目录.git
添加文件
$ git add <file>
把文件提交到仓库
$ git commit -m "wrote a xxx file"
-m
后面添加的是提交的说明,可以用$ git log
来查看每次提交给仓库时附带的说明
commit
可以一次提交多个文件
管理修改及版本
查看修改以及提交修改
$ git status
可以查看仓库当前状态,如果有文件被修改会告知是哪个文件
$ git diff
可以查看所有的修改信息,也可以用git diff <file>
来查看特定文件的修改
提交修改和提交新文件都是用$ git add <file>
和$ git commit -m "add xxxxxx"
每次输入命令后都可以用$ git status
查看仓库当前状态.
版本回退
$ git log
可以查看历史记录,包括每次修改的版本号\作者\日期\修改说明文字都有
Git用HEAD
表示当前版本,上一个版本是HEAD^
,再上一个是HEAD^^
,如果过多可以用HEAD~100
来表示往上100个版本.
$ git reset --hard HEAD^
就可以返回上一个版本了.把HEAD^
换成用$ git log
查看的版本号也可以指定回退的版本,而且版本号不需要打全(但是要保证能识别出是哪个版本,不能和其他版本号冲突),回退之后想回到新版本也可以用这个命令
如果清空了历史消息记录,看不到新版本的版本号,可以用$ git reflog
来查看版本号更迭.
工作区和暂存区
工作区就是电脑里能看到的目录.
工作区有一个隐藏目录.git
,这是Git的版本库.
Git的版本库里存的内容包括名为stage(或index)的暂存区,以及Git自动创建的第一个分支master
和指向master
的一个指针叫head
.
之前的提交修改和提交新文件都是通过暂存区来完成的:
$ git add <file>
实际上是把文件修改添加到暂存区.$ git commit
实际上是把暂存区的所有内容提交到当前分支.
管理修改
Git管理的是修改而不是文件,每次修改如果不用$ git add
将其加入暂存区,就不会在$ git commit
时提交到当前分支.
撤销修改
$ git checkout -- <file>
可以把文件在工作区的修改全部撤销,
- 如果文件修改后未被提交到暂存区,现在就撤销到和版本库一样的状态.
- 如果已经被提交到暂存区,然后又被修改过,撤销修改就会回到添加到暂存区后的状态.
总之就是回到最近一次git commit
或git add
后的状态.
$ git reset HEAD <file>
可以把暂存区的修改撤销掉(unstage),重新放回工作区.但是这时工作区的修改还存在,如果要放弃修改的话就需要用到之前的$ git checkout -- <file>
.
如果暂存区的修改已经被提交,那就要用到之前的回退版本(前提是没有提交到远程库).
删除文件
如果删除了工作区的文件,工作区和版本库出现不同,$ git status
可以提醒哪些文件被删除
- 如果要删除版本库里的文件,就用
$ git rm <file>
($ git add <file>
也行)删掉,再用$ git commit
提交 - 如果是误删,就用
$ git checkout -- <file>
恢复,但是注意这时恢复的是版本库里的最新版本,也就是说最近一次提交后修改的内容是无法恢复的.
远程仓库
把.ssh
目录下id_rsa.pub
文件内的内容复制到GitHub上.
添加远程库
在GitHub上创建新仓库后,在本地的仓库下运行命令
git remote add origin git@github.com:UseName/learnGit.git
添加后,远程库的名字是origin
,这是默认叫法,也可以改成别的.
下一步把本地库的所有内容第一次推送到远程库上:
$ git push -u origin master
$ git push
是把本地库内容推送到远程库的命令,就是把当前分支master
推送到远程.
-u
参数会指定默认主机为后面的origin
,这样之后就可以不加任何参数使用git push.
现在开始本地提交后可以用$ git push (origin master)
来把本地master
分支的最新修改推送到GitHub.
删除远程库
如果要删除远程库,可以用git remote -v
先查看远程库信息确认后,用git remote rm <name>
命令.(只是解除本地和远程的绑定)
从远程库克隆
用$ git clone <ssh key>
来把远程库克隆到本地库.
也可以用别的协议如https.
分支管理
创建与合并分支
Git创建分支和删除分支其实是对指针进行操作.
创建dev
分支并切换到dev
分支:
$ git checkout -b dev
上面的命令相当于执行了两条命令:
$ git branch dev
和 $ git checkout dev
然后用$ git branch
查看当前分支.
在dev
分支下进行修改并提交后,用$ git checkout master
切换回master
分支,然后这时会发现在dev
分支下的修改没有生效,需要把dev
分支的结果合并到master
分支:
$ git merge dev
完成合并后可以删除dev
分支:
$ git branch -d dev
由于git checkout
命令和前面的撤销修改命令一致,可能会引起歧义,现在可以用git switch
来切换分支.(注意旧版本可能不支持switch
)
创建并切换到新的dev
分支命令:
$ git switch -c dev
直接切换到现有的master分支:
$ git switch master
解决冲突
如果master
分支和dev
分支分别有新提交,Git就不能进行快速合并(把master
的指针指向dev
),这时强行合并就可能会有冲突.此时用git merge
合并会提醒合并失败.需要手动解决冲突.手动修改完冲突文件并提交修改后再用git merge
合并.最后可以用$ git log --graph
可视化地查看合并情况.
分支管理策略
合并分支时,加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward
合并就看不出来曾经做过合并。
Bug分支
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash
一下,然后去修复bug,修复后,再git stash pop
,回到工作现场;
在master
分支上修复的bug,想要合并到当前dev
分支,可以用git cherry-pick <commit>
命令,把bug提交的修改“复制”到当前分支,避免重复劳动.
Feature分支
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>
强行删除。
多人协作
- 查看远程库信息,使用
git remote
或git remote -v
- 本地新建的分支如果不推送到远程,对其他人就是不可见的
- 从本地推送分支,使用
git push origin branch-name
,如果推送失败,先用git pull
抓取远程的新提交 - 在本地创建和远程分支对应的分支,使用
git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致 - 建立本地分支和远程分支的关联,使用
git branch --set-upstream branch-name origin/branch-name
- 从远程抓取分支,使用
git pull
,如果有冲突,要先处理冲突
Rebase
- rebase操作可以把本地未push的分叉提交历史整理成直线
- rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比
标签管理
tag可以理解成是commit号的别名
创建标签
- 命令
git tag <tagname>
用于新建一个标签,默认为HEAD
,也可以指定一个commit id - 命令
git tag -a <tagname> -m "blablabla..."
可以指定标签信息 - 命令
git tag
可以查看所有标签
操作标签
- 命令
git tag -d <tagname>
可以删除一个本地标签 - 命令
git push origin <tagname>
可以推送一个本地标签 - 命令
git push origin --tags
可以推送全部未推送过的本地标签 - 命令
git push origin :refs/tags/<tagname>
可以删除一个远程标签
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)