前言
本文作为Git笔记只记录基本的概念与命令,并提供详细学习的链接地址。
作者:ikat
时间:2025-05-16
一、Git简介
详细教程:
Git新手看这个基础教程
https://mp.weixin.qq.com/s/eRzuJpXp-Pwd8-JcJAYycw
Git新手视频教程:
https://www.bilibili.com/video/BV1HM411377j/
有基础的看这些:
GIt命令详细教程
https://blog.csdn.net/u013268445/article/details/143919578
git深入理解(一):暂存区(Stage),索引(index)
https://blog.csdn.net/raoxiaoya/article/details/110824019
1.克隆仓库:在开始工作之前,首先需要将远程仓库克隆到本地机器上。使用git clone
命令可以将远程仓库完整地复制到本地。
2.创建分支:为了并行开发和隔离不同的功能或修复,通常会创建新的分支。使用git branch
命令可以创建一个新的分支,例如:git branch feature-branch
。
3.切换分支:使用git checkout
命令可以切换到创建的分支,例如:git checkout feature-branch
。
4.添加和提交更改:在所选分支上进行工作后,可以使用git add
命令将更改的文件添加到暂存区,然后使用git commit
命令将暂存区的更改提交到本地仓库,
5.推送更改:如果要将本地分支的更改推送到远程仓库,可以使用git push
命令,例如:git push origin feature-branch
。这将把本地分支的更改推送到远程仓库中对应的分支。
6.合并分支:当分支的工作完成后,可以将其合并到主分支(通常是master
分支)或其他目标分支中。使用git merge
命令可以执行分支合并,
7.解决冲突:如果在合并分支时发生冲突(即同一文件的不同部分具有不同的更改),需要手动解决冲突。在冲突解决后,再次执行git add
和git commit
命令以完成合并。
8.拉取更新:在团队协作中,如果其他人推送了更改到远程仓库,可以使用git pull
命令拉取更新到本地仓库,以确保与最新代码保持同步
二、常用命令
git一图所用命令:
(1)基本概念
1.Git的四个区域
工作区(working Directory)
:即为你在电脑里看到的目录暂存区(Stage/Index)
:一般存放在.git目录下的index文件,所以暂存区也叫索引。本地仓库(Repository)
:工作区有个隐藏目录.git,此外Git的版本库。远程仓库(Remote)
:托管在远程服务器上的仓库。
2.Git的三种转态
已修改(modified)
:修改了文件,但是没有保存到暂存区。已暂存(stage)
:把修改后的文件放到暂存区。已提交(comitted)
:把暂存的文件提交到本地仓库。
3.常用概念
main
:默认主分支origin
:默认远程仓库HEAD
:指向当前分支的指针HEAD^
:上一个版本HEAD^4
:上4个版本
4.特殊文件
.git
:Git仓库的元数据和对象数据库.gitignore
:忽略文件,不需要提交到仓库的文件.gitattributes
:指定文件的属性,比如换行符.gitkeep
:使空目录被提交到仓库.gitmodules
:记录子模块的信息.gitconfig
:记录仓库的配置信息
(2)常用命令
1.添加和提交
#添加一个文件到仓库
git add <file>
#添加所有文件到仓库
git add .
#提交所有暂存区的文件到仓库
git commit -m "message"
#提交所有已修改的文件到仓库
git commit -am "message"
除了目录和文件内容的实际变化,Git还会在每次提交的时候记录其他一些元数据,包括日志消息和做出本次变更的作者。一条完全限定的git commit命令必须提供日志消息和作者。
元数据必须得写上去,不然会提交失败。
2.撤销与回退
移动一个文件到新的位置,影响范围:工作区、暂存区
git mv <file> <new-file>
删除一个文件,影响范围:工作区、暂存区
git rm <file>
只从暂存区中删除一个文件,影响范围:暂存区
git rm --cached <file>
恢复一个文件到之前的版本,影响范围:工作区
git chekout <file> <commit-id>
反做:创建一个新的提交,用来撤销指定的提交,后者的所有变化都被前者抵消,并且应用到当前分支
相当于多出来一个新版本去修改指定版本的内容,适用于精确、自动化撤销特定提交,且需保留历史记录的协作场景。
git revert <commit-id>
回退版本命令
#留下暂存区与工作区,相当于只撤回提交
git reset --soft <commit-id>
#完全回到目标版本干净的样子,工作区暂存区全清空
git reset --hard <commit-id>
#默认参数,留下工作区,不留下暂存区
git reset --mixed <commit-id>
3.藏匿stash
在 Git 中,工作区、暂存区和提交区是三个重要的概念。当开发者对工作区的文件进行修改后,这些修改是未跟踪的。开发者可以使用 git add 命令将这些修改添加到暂存区,并使用 git commit 命令将暂存区的修改提交到本地仓库。但是,如果开发者想要保存这些修改而不立即提交,git stash 命令就派上了用场。
存储未提交的更改
git stash
# 或者使用更详细的保存方式
git stash push -m "描述信息"
这会:
- 保存工作区和暂存区的所有修改
- 将你的仓库恢复到上一次提交时的状态(干净状态)
- 创建一个新的 stash 条目(编号从 0 开始)
列出所有 stash
git stash list
输出类似:
stash@{0}: On master: 描述信息stash@{1}: WIP on feature-branch: 1a2b3c4d 上次提交信息
恢复 stash:
#恢复最近一次的 stash 并删除 stash 记录
git stash pop
#恢复特定 stash 但不删除记录
git stash apply stash@{n} # n 是 stash 编号
#恢复特定 stash 并删除记录
git stash pop stash@{n}
创建分支并应用 stash
git stash branch 新分支名 stash@{n}
这会基于 stash 创建时所在的提交创建新分支,并自动应用该 stash 的更改。
删除 stash
#删除特定 stash
git stash drop stash@{n}
#删除所有 stash
git stash clear
4.分支
查看所有本地分支,当前分支前面会有个*
,-r
查看远程分支,-a
查看所有分支
git branch
创建一个新分支
git branch <branch-name>
- 新分支的工作区继承自当前分支的节点(即创建时的
HEAD
提交)。
创建一个新分支,并切换到该分支
git checkout -b <branch-name>
切换到指定分区,并更新工作区
git switch <branch-name>
git checkout <branch-name>
问题,工作区会怎样改变?
- 更新工作区和暂存区:
- 工作区和暂存区的内容会被替换为目标分支的最新提交状态。
- 如果当前工作区/暂存区有未提交的修改(与目标分支无冲突),Git 会保留这些修改(但可能会提示
your local changes would be overwritten
)。 - 如果有冲突(目标分支的文件与当前修改冲突),Git 会阻止切换,需先提交或暂存(
git stash
)。
删除分支
-d
即为delete只删除已合并的分支
-D
为强制删除,无论是否合并
git branch -d <branch-name>
git branch -D <branch-name>
给当前的提交打上标签,通常用于版本发布
git tag <tag-name>
5.合并分支
1)merge合并
当前所在分支为合并后的目标分支,branch-name为被合并的分支
git merge <branch-name>
若发现文件冲突,用一下命令查看
git status
git diff
修改冲突后进行提交,提交后自动完成合并
git add .
#进行提交,提交后自动完成合并
git commit -m "merge conflict"
#终止合并
git merge --abort
2)Rebase变基
具体功能:找到祖先节点将当前从祖先节点后的分支嫁接到被合并的分支上面。
git rebase <branch-name>
优缺点:
merge优点:不会破坏原分支的提交历史,方便回溯查看。
merge缺点:会产生额外的提交节点,分支图复杂。
Rebase优点:不会新增额外的提交记录,形成线性历史,比较直观和干净。
Rebase缺点:会改变提交历史,改变了当前分支branchout的节点避免在共享分支使用。
6.远程仓库
添加远程仓库
git remote add <remote-name> <remote-url>
查看远程仓库
git remote -v
删除远程仓库
git remote rm <remote-name>
重命名远程仓库
git remote rename <old-name> <new-name>
从远程仓库拉取代码
git pull <remote-name> <branch-name>
fetch默认远程仓库(origin)当前分支的代码,然后合并到本地分支
git pull
将本地改动的代码Rebase到远程仓库最新的代码上(为了有一个干净的、线性的提交历史)
git pull --rebase
推送代码到远程仓库(然后再发起pull request)
git push <remote-name> <branch-name>
获取所有远程分支
git fetch <remote-name>
查看远程分支
git branch -r
fetch某一个特定的远程分支
git fetch <remote-name> <branch-name>
7.查看命令
#查看暂存区文件
git ls-files
#查看所有提交记录
git reflog
#查看提交记录
git log
#文件状态
git status
#查看分支列表
git branch
#查看分支图
git log --graph --online --decorate --all
#可以用以下命令简化查看分支图,后续只用输入graph即可
alias graph="git log --graph --online --decorate --all"
提问:
1.如果我add了一个文件,如何删除它?
git rm --cached file
2.在一个开发分支/版本下,我add了目录下的所有文件,然后切换到另个分支准备修改bug,修改成功过后add并commit了,然后再返回到刚才的开发分支,刚才add了的文件还在吗?这个问题也可以理解为:暂存区是不是与版本绑定的?
答:暂存区不绑定分支,但切换分支时可能因冲突被部分清空。若文件在分支间无冲突,暂存区则会保留;否则Git会强制丢弃冲突部分。
应该的做法:在切换分支时,进行commit 或者 stash
三、Git之GitFlow工作流
1.Git Flow
Git之GitFlow工作流 | Gitflow Workflow(万字整理,已是最详)
https://blog.csdn.net/sunyctf/article/details/130587970
2.更简洁工作流模型Github Flow:
GitHub Flow 工作流程、知识要点:
https://blog.csdn.net/i6101206007/article/details/108048267
四、Git实践
(1)新远程仓库的关联同步与拉取
1. 首先打开 git bash
2. 在GitHub上创建远程仓库
3. 初始化本地仓库
git init
4. 添加远程仓库
git remote add origin git@github.com:qinikat/CqoocACC.git
5. 验证仓库是否关联成功
git remote -v
输出:
origin [git@github.com](mailto:git@github.com):qinikat/CqoocACC.git (fetch) origin [git@github.com](mailto:git@github.com):qinikat/CqoocACC.git (push)
6. 创建本地仓库master
git checkout -b master
7. 拉取远程仓库数据并合并到当前分支
git pull origin master
8. 添加本地文件到暂存区
git add .
9. 开始提交
git commit -m "Add cqooc_auto.js"
10. 推送到远程仓库
git push origin master
git status
五、Git遇到的问题
(1)文件名过长
问题现象:
问题原因:文件名过长,导致无法将某些文件添加到 Git 中。在 Windows 环境下,Git 默认会受到文件路径长度限制,这个限制通常为 260 个字符,这会导致你无法添加某些路径很长的文件。
解决方案:
git config --global core.longpaths true
这样即可解决。
六、git其他工具
可视化工具:
gitkraken
小乌龟
SourceTree