git 学习小记
git 基本概念
- 工作区:仓库的目录。工作区是独立于各个分支的。
- 暂存区:数据暂时存放的区域,类似于工作区写入版本库前的缓存区。暂存区是独立于各个分支的。
- 版本库:存放所有已经提交到本地仓库的代码版本
- 版本结构:树结构,树中每个节点代表一个代码版本。
本地仓库的三个主要部分
- working tree
- staging area
- Git directory(Repository)
文件状态的生命周期
git文件有四种状态:
- Untracked
- Modified
- Staged
- Unmodified
Untacked状态
添加到working tree
中的新文件,没有被git进行跟踪管理,处于untracked
状态
Modified状态
对处于Unmodified
状态的文件进行修改(及已经commit
到repository
中),该文件状态变为Modified
对位于staging area
中的文件进行修改,该文件状态也会变成modified
Staged状态
Untracked
状态的文件被git add
放入staging area
后,位于暂存区的文件处于staged
状态
Unmodified状态
使用commit
命令提交到repository
中的文件状态处于Unmodified
状态
git 常用命令
git 注册信息
git config --global user.name xxx
: 设置全局用户名,信息记录在 ~/.gitconfig
文件中
git config --global user.email xxx@xxx.com
: 设置全局邮箱地址,信息记录在 ~/.gitconfig
文件中
git 单分支基本指令
git init
: 将当前目录配置成 git
仓库,信息记录在隐藏的 .git
文件夹中
git add XX
: 将 XX
文件添加到 暂存区
git add .
: 将所有待加入 暂存区 的文件加入 暂存区
(.
可以用 *
代替)
git rm --cached XX
: 将文件从 仓库索引目录 中 删掉
git commit -m "给自己看的备注信息"
: 将 暂存区 的内容 提交 到 当前分支(新建一个结点,且将head
移到该结点上)
git status
: 查看仓库 状态
git diff XX
: 查看 XX
文件相对于 暂存区 修改了哪些内容(好像是暂存区没有的话会比较当前和HEAD
)
git rm filename
用于删除,如果工作区和暂存区都有名字为filename
的文件,那么会给出提示是否要强制删除该文件(同一执行后工作区和暂存区该文件都会消失),如果工作区中该文件已经删除但暂存区还有,那么该命令直接执行,将从暂存区中删除该文件(此时效果等同于直接git add .
,将工作区更改应用于暂存区)。另一方面,
git rm --cached filename
仅仅是在暂存区中将该文件删除,取消跟踪(类似于工作区中刚创建该文件还没有add到暂存区),工作区没有任何变化。
Untracked files:
提示信息,表示以下文件是不受我们管理的(一般用红色标出来)区别:
git restore
用于恢复,数据有两种流向;
git rm
用于删除,主要是使用–-cached
参数来删除暂存区的内容。假如目前HEAD
所指版本中没有该文件,而 工作区和暂存区都有,那么git restore --staged
将和git rm --cached
效果相同。
删除操作使用技巧
1.从working tree中撤销rm操作
如果不小心使用rm
删除working tree
中的文件
可以使用 git restore file
来在working tree
中撤销该操作
2.从staging area中撤销操作到working area,然后重复上一步
rm
操作working directory
中的文件,并git add
到暂存区中,可以先使用git restore --staged
撤销暂存区中的改变,然后再撤销working tree
中的操作
使用git rm file
会直接将删除操作的改变提交到暂存区,可以通过上述步骤撤销
3.从staging area
中删除,但是保留在working tree
中
git rm --cached 4.txt
git 单分支版本切换指令
git log
: 查看当前分支的 所有版本 (从下往上看)
git log --pretty=oneline
:将git log
的结果压缩显示- 特别注意,要按q键退出!
git reflog
: 查看 HEAD指针 的 移动历史(包括被回滚的版本,这是回滚后再回来的方法)
git reset --hard HEAD^
或 git reset --hard HEAD~
: 将代码库 回滚 到 上一个版本
git reset --hard HEAD^^
: 往上 回滚 两次,以此类推(几个 ^
就回滚几次)
git reset --hard HEAD~100
: 往上 回滚 100个版本,以此类推(~n
回滚 n
次)
git reset --hard 版本号
: 回滚 到某一特定版本
版本号指的是下图右边黄色的哈希值
git checkout — XX
或 git restore XX
: 将 XX
文件 尚未加入暂存区 的修改 全部撤销
git restore
命令用于恢复,恢复有两种:从暂存区恢复到工作区(即暂存区内容copy还原工作区)、从HEAD
所指版本库恢复到暂存区(版本库内容copy还原暂存区)
-
git restore -- filename
: 将filename
从暂存区恢复到工作区,其中--
可以不加,如果暂存区没有东西,是空的话就回滚到HEAD
指向的文件(撤销本地文件,表示将在工作区但是 不在暂存区 的文件撤销更改)(将暂存区的文件状态,原封不动退回工作区) -
git restore --staged filename
: 将HEAD
所指版本库的暂存区撤销(撤销暂存区)
是把git add filename
放在暂存区的filename
文件删除 (staged
就是暂存区的意思)(直接将暂存区的文件删掉)
另外,git checkout -- filename
作用与 git restore -- filename
一致,都是将文件从暂存区恢复到工作区。
git restore readme.txt
:把暂存区的文件撤回到工作区,工作区的文件会被暂存区的文件覆盖,
也就是说本地的文件会被修改 可以先把一个文件上传到暂存区,然后把工作区的文件修改一下,再用这个命令,看看最后的文件内容是不是和第一开始上传到暂存区的文件内容相同.
git restore –-staged readme.txt
:会把暂存区的文件撤回到工作区,但工作区的文件不会被修改,可以理解位只是撤回了暂存区的文件,和git rm –-cached readme.txt
效果相同
撤销上次commit提交
如果需要删除的不只是某个文件,而是交错的代码,那么有以下三种方法可以删除 commit
git reset
:回滚到某次提交。git reset --soft
:此次提交之后的修改会被退回到暂存区。git reset --hard
:此次提交之后的修改不做任何保留,git status 查看工作区是没有记录的。
git reset --soft head~1
: 撤销上一次commit,不会撤销git add
git reset --hard head~1
: 撤销上一次commit,同时撤销 git add
git 单分支与远程仓库交互的指令
git remote add origin git@git.acwing.com:xxx/XXX.git
: 将本地仓库关联到远程仓库
git push -u
(第一次需要-u以后不需要) : 将当前分支推送到远程仓库
git push origin branch_name
: 将本地的 某个分支 推送到远程仓库
git clone git@git.acwing.com:xxx/XXX.git
: 将远程仓库 XXX
下载 到当前目录下
git 多分支管理指令
不同分支对同一文件的修改相互影响。在工作目录(
working tree
)中进行的更改,除非自己提交它们,否则不属于任何分支,这是因为所有分支都是共用一个暂存区(staging area
)的,只有commit
后才会产生新的结点。yxc:切换分支之前,最好先将当前的内容
commit
一下,以防stash
冲突
git branch
: 查看 所有分支 和 当前所处分支
git branch branch_name
: 创建 新分支
git checkout -b branch_name
: 创建并切换 到 branch_name
这个分支
git checkout branch_name
: 切换 到 branch_name
这个分支
git merge branch_name
: 将分支 branch_name
合并 到 当前分支 上(这里的合并是指将当前分支的当前节点的head
指向branch_name
的head
,即只是更改了head
的引用)
git push --set-upstream origin branch_name
: 本地新建分支后,使用该命令将该分支同步到云端仓库,即如果云端没有branch_name
这个分支就在云端仓库新建该分支。
git 多分支与远程仓库交互的指令
git branch -d branch_name
: 删除 本地仓库 的 branch_name
分支
git push -d origin branch_name
: 删除 远程仓库 的 branch_name
分支
git push --set-upstream origin branch_name
: 设置 本地仓库 的 branch_name
分支与 远程仓库 的 branch_name
分支 对应
git branch --set-upstream-to=origin/branch_name1 branch_name2
: 将 远程仓库 的 branch_name1
分支与 本地仓库 的 branch_name2
分支 对应
git pull
: 将 远程仓库 的 当前分支 与 本地仓库 的 当前分支 合并
git pull origin branch_name
: 将 远程仓库 的branch_name
分支与 本地仓库 的当前分支 合并
git checkout -t origin/branch_name
: 将 远程仓库 的branch_name
分支拉取到 本地仓库
git stash暂存
~实验证明,不同的分支也是公用一个stash
的:在master
分支里git stash
的时候,切换分支到dev
分支,使用git stash pop
依然能把备份弹出来。。~
git stash
: 将 工作区 和 暂存区 中 尚未提交 的修改存入 栈 中(此时工作区与缓存区都没有东西了,可以stash
多次,从最近一次的commit
读取相关内容。)
git stash apply
: 将 栈顶 存储的修改 恢复 到 当前分支 ,但 不删除 栈顶元素
git stash drop
: 删除 栈顶 存储的修改
git stash pop
: 将 栈顶 存储的修改 恢复 到当前分支,同时删除 栈顶元素
git stash list
: 查看 栈中 所有元素
切换分支时,如果当前分支有修改,又不想提交或放弃,可以使用 git stash
将改动存到暂存区。
git stash
后即可以随意切换分支,切换后再使用 git stash pop
即可将暂存区的改动恢复至当前分支。
但如果使用 git stash pop
后有冲突时,如何撤销?
可以使用 git reset --hard
,即可撤销git stash pop
操作,将当前分支状态恢复。
而该操作后,git stash
暂存区的记录也不会被删除,可通过git stash show
查看
常见错误(以后遇到的问题也会更新)
1.连接gitlab
时:fatal: remote origin already exists.
:
解决办法
git remote remove origin
git remote add origin git@git.acwing.com:xxxx/xxxx.git
2.git add .
时出现的warning
warning: LF will be replaced by CRLF in README.
The file will have its original line endings in your working directory
解决办法:
git config --global core.autocrlf false
原因可能是路径中存在/
的符号转义问题,false
表示不转换符号
3.git stash pop
后git stash list
依然存在当时stash
的版本信息,并没有pop
出来,导致一直冲突出错
原因:在使用git stash
代码时,经常会碰到有冲突的情况,一旦出现冲突的话,系统会认为你的stash
没有结束.
导致的结果是git stash list
中的列表依然存在,实际上代码已经pop
出来了。
解决办法:
1、解决文件中冲突的的部分,
打开冲突的文件,会看到类似如下的内容:
git
冲突内容:
其中Updated upstream
和=====
之间的内容就是pull
下来的内容,====
和stashed changes
之间的内容就是本地修改的内容。碰到这种情况,git
也不知道哪行内容是需要的,所以要自行确定需要的内容。
解决完成之后,就可以正常的提交了。
2、删除stash
。git stash drop <stash@{id}>
如果不加stash
编号,默认的就是删除最新的,也就是编号为0
的那个,加编号就是删除指定编号的stash
。或者git stash clear
是清除所有stash
,整个世界一下子清净了!
y总Linux基础课听着怎么样
我现在忘得差不多了。。。
奥奥,听人说y总算法课不错,工程课一般
主要是y总太厉害了,对他来说很简单的东西他就一般不讲了,但这世上能对y总造成困难的东西一般我们也解决不了QAQ
顶一顶(╹▽╹)
👍