1、该系列为ACWing中Linux基础课,已购买正版,课程作者为yxc
2、y总培训真的是业界良心,大家有时间可以报一下
3、为啥写在这儿,问就是oneNote的内存不够了QAQ
git
git用树结构管理所有的历史版本;
每一个节点代表代码的版本,也可以扩展很多分支,或实现不同分支的合并和回滚;
1、git基本概念
-
工作区:仓库的目录。工作区是独立于各个分支的(不管在哪个分支里面,工作区都是同一个)。(本地看git就是一个文件夹,当前的工作目录)
-
暂存区:数据暂时存放的区域,类似于工作区写入版本库前的缓存区。暂存区是独立于各个分支的。(暂存区是工作区和版本库的桥梁,每次先从工作区存一点在暂存区,再整体存入版本库)
-
版本库:存放所有已经提交到本地仓库的代码版本(将所有版本用一棵树存下来)。
-
版本结构:树结构,树中每个节点代表一个代码版本。
-
头指针Head:每次head只会处于其中一个节点;当要将当前工作区存入版本库时,会在head后创建一个新的节点,同时将head后移一位。
-
主分支:默认创建的是master分支;origin是添加的云端分支,通过
git remote add origin
与本地完全一致;
acs@61f2b97ca5ed:~/project$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
表示当前分支比云端分支多1个版本
- 分支:任意一个节点都可以有分支,在commit前只是有一个分支的趋向。
2、 git常用命令
-
git config --global user.name xxx
:设置全局用户名,信息记录在~/.gitconfig
文件中; -
git config --global user.email xxx@xxx.com
:设置全局邮箱地址,信息记录在~/.gitconfig
文件中 -
git init
:将当前目录配置成git仓库,信息记录在隐藏的.git
文件夹中 -
git add XX
:将XX文件的修改添加到暂存区;只暂存main.cpp可以将B文件(main.cpp)作为A文件(readme.txt)的下一个节点。删文件这个操作也可以加入暂存区,同样用git add X
命令git add .
:将所有待加入暂存区的文件加入暂存区;
-
git rm --cached XX
:将文件从仓库索引目录中删掉(不去管理该文件); -
git restore --stage XX
将暂存区的文件(暂存区的修改)从暂存区撤出,但不会更改文件;(与git rm --cached XX
功能相似,只是从暂存区里拿出来,清除的是暂存区) -
git restore XX
或git checkout — XX
:将XX文件尚未加入暂存区的修改全部撤销(将上一步对代码的修改取消并回滚到暂存区里暂存的版本,删除的工作区,如果暂存区没有内容,则回滚到Head节点指向的版本)rm a.txt git restore a.txt
区别:
git restore --staged
将文件从暂存区撤出,但不会撤销工作区文件的更改(可以比较出当前文件和暂存区文件的不同)
git resore
利用暂存区的版本来撤销当前工作区的操作
acs@61f2b97ca5ed:~/project$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: readme.txt
可以使用"git restore"将修改全部撤回
-
git commit -m "给自己看的备注信息"
:将暂存区的内容提交到当前分支(版本库) -
git status
:查看仓库状态acs@61f2b97ca5ed:~/project$ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: readme.txt no changes added to commit (use "git add" and/or "git commit -a") acs@61f2b97ca5ed:~/project$ git add readme.txt acs@61f2b97ca5ed:~/project$ git status On branch master Changes to be committed: (use "git restore --staged <file>..." to unstage) modified: readme.txt
-
git diff XX
:查看XX文件相对于暂存区修改了哪些内容(当工作区有改动,临时区为空,diff的对比是“工作区与最后一次commit提交的仓库的共同文件”;当工作区有改动,临时区不为空,diff对比的是“工作区与暂存区的共同文件”) -
git log
:查看当前分支的所有版本;git log --pretty=oneline
用一行显示信息(从起点到head的路径);acs@61f2b97ca5ed:~/project$ git log --pretty=oneline 22ef31268e7f4d432a0cb33dad7f54f7b967b4d5 (HEAD -> master) 3333th 25f34b0c15feb5a4416fdf7367b43a65a7e47762 add readme.txt the 2th e510b7b536e1a67fe2927c5a78e95cccf00b8b2b add readme.txt
-
git reflog
:查看HEAD指针的移动历史(包括被回滚的版本)(head所有的移动历史记录)(按q
退出)从下往上看,最开始在add readme.txt; 第二在 add 222; 第三在 add 333; 最后回到 HEAD^^; 每一个版本编号是哈希值的前7位; ===================================== acs@61f2b97ca5ed:~/project$ git reflog e510b7b (HEAD -> master) HEAD@{0}: reset: moving to HEAD^^ 22ef312 HEAD@{1}: commit: 3333th 25f34b0 HEAD@{2}: commit: add readme.txt the 2th e510b7b (HEAD -> master) HEAD@{3}: commit (initial): add readme.txt
-
git reset --hard HEAD^
或git reset --hard HEAD~
:将代码库回滚到上一个版本(回滚是不会删掉代码的)git reset --hard HEAD^^
:往上回滚两次,以此类推git reset --hard HEAD~100
:往上回滚100个版本git reset --hard 版本号
:回滚到某一特定版本
-
rm project -rf
删除本地项目;
分支
-
git checkout -b branch_name
:创建并切换到branch_name
这个分支;当前新分支的内容与head节点表示的内容相同;暂存区和分支没有任何的关系,master 和dev分支共用一个暂存区。commit
时处于哪个分支就加在哪个分支后面 -
git branch
:查看所有分支和当前所处分支acs@61f2b97ca5ed:~/project$ git branch * dev (*表示当前所在的分支) master
-
git checkout branch_name
:切换到branch_name
这个分支acs@61f2b97ca5ed:~/project$ git checkout master Switched to branch 'master' Your branch is up to date with 'origin/master'. acs@61f2b97ca5ed:~/project$ git branch dev * master
-
git merge branch_name
:将分支branch_name
最新的节点合并到当前分支的当前节点上; 使用的Fast-forward是快速合并模式,该模式没有产生复制,而是将master上head节点直接指向dev分支的节点;
acs@61f2b97ca5ed:~/project$ git merge dev
Updating b606141..0108d73
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
-
git merge branch_name -noff
:将dev分支复制到master分支上; -
合并冲突:新分支的数据是(777 888),master分支的数据是(777 999),自动合并会失败,
git status
显示both modified
;<<<<<<<<<<HEAD 当前分支里的内容 ============== dev2分支的内容 >>>>>>>>>>>
-
git branch -d branch_name
:删除本地仓库的branch_nam
e分支 -
git branch branch_name
:创建新分支
栈
-
栈:存储所有历史没有持久化的修改(例如断电的时候);只与本地有关;
-
git stash
:将工作区和暂存区中尚未提交的修改存入栈中,存入后工作区和暂存区就没东西了; -
git stash apply
:将栈顶存储的修改恢复到当前分支,但不删除栈顶元素 -
git stash drop
:删除栈顶存储的修改 -
git stash pop
:将栈顶存储的修改恢复到当前分支,同时删除栈顶元素 -
git stash list
:查看栈中所有元素
云
-
git remote add origin git@git.acwing.com:zxy_12138/project.git
:将本地仓库关联(上传)到远程仓库(映射至git.acwing.com服务器中zxy_12138/project
文件夹); -
git init --initial-branch=main
:推送现有文件夹,本地是master
应改为master; -
删除现有的origin分支:
git remote remove origin
(git remove add出错时使用); -
git push -u (第一次需要-u以后不需要)
:将当前分支推送到远程仓库git push origin branch_name
:将本地的分支推送到远程仓库(非master不能用git push
直接推因为对应不到相应的分支)git push --set-upstream origin branch_name
:设置本地的branch_name
分支对应远程仓库的branch_name
分支(在云端创建了该分支)git push -u origin main
:本地改为master;省略origin,main则为推送当前分支;git push -d origin branch_name
:删除远程仓库的branch_name
分支
-
git clone git@git.acwing.com:xxx/XXX.git
:将远程仓库XXX下载到当前目录下(下载后虽然版本都在,但head节点记录为空) -
git pull
:将远程仓库的当前分支与本地仓库的当前分支的当前节点合并(下载+merge)git pull origin branch_name
:将远程仓库的branch_name分支与本地仓库的当前分支(的当前节点)合并
git pull origin dev5 本地master合并云端dev5
-
git branch --set-upstream-to=origin/branch_name1 branch_name2
:将远程的branch_name1
分支与本地的branch_name2
分支对应(绑定);本地要先创建branch_name2
分支;将云端的某个分支合并到本地的某个分支; -
git checkout -t origin/branch_name
将远程的branch_name
分支拉取到本地git checkout -t origin/dev 合并dev分支
-
多人合作开发dev分支的模式:1、先clone云端master分支;2、checkout创建本地dev分支;3、
git branch --set-upstream-to=origin/dev dev
;4、git pull
下载云端分支;5、第一个人写(aaa hhh),第二个人写(aaa iii)两人同时push第二个人会报错;,第二个人要先git pull
并解决冲突,将解决的版本持久化并提交到云端。