git-命令行

vim命令

set nu显示行数
:n,md删除n-m行
/xxx查找xxx

在一般模式下

u //复原 等驾驭ctrl + z
ctrl + r //重复上一个动作
dd//删除一整行
G//到文件最下面
gg //到文件最上main
nG //到第n行
0//到当前行最前面
$//到当前行最后

:n1,n2s/word1/word2/g	
//n1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字符串,并将该字符串取代为 word2 !举例来说,在 100 到 200 行之间搜寻 vbird 并取代为 VBIRD 则:
//『:100,200s/vbird/VBIRD/g』。(常用)

:1,$s/word1/word2/g	
//从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !(常用)

:1,$s/word1/word2/gc	
//从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !且在取代前显示提示字符给用户确认 (confirm) 是否需要取代!(常用)

命令模式

set nu//显示行号
set nonu//取消显示行号

vim快捷命令

删除空格行

在Vim中,g/^\s*$/d 是一个删除空行的命令,其中的正则表达式含义如下:

g: 全局标志,表示在整个文件中搜索匹配项。
/^\s*$/: 正则表达式,用于匹配空行。
^: 匹配行的开头。
\s*: 匹配零个或多个空白字符(包括空格和制表符)。
$: 匹配行的结尾。

terminal基础命令

粘贴:双击选中要复制的部分 然后在想要粘贴的地方按下滚轮
q// 返回上一级

rm *.log // 就是删掉当前路径下.log的文件

command + shift + . 当前文件路径下显示隐藏文件

command + shift + , 当前文件路径下不显示隐藏文件

vim fileName , 对文件进行修改 

// i 插入 

x 删除

 : 切换到底线命令模式 此时 w保存 q退出

git基础命令:

git init//在当前路径下初始化一个空的仓库 就是一个本地库

git config –-global user.name”xxx”// 设置name   .email设置邮箱

git config --list//查询设置内容

git status //查看当前git状况.  // + -s // 以极简方式显示 具体网上查

git add .// 将工作目录中的项目添加到索引中 // + -u // 将所有跟踪了的被修改和被删除的文件添加到索引中 只有先被add到索引中的才是被跟踪的 如果你新创建了一个x.cpp这个就还没被track,此时add -u就不会被添加到索引中,被add后就是tracked 此时再对他修改 再add -u就可以提交 

add .只会提交当前目录或者子目录下相应文件。
add -A无论在哪个目录执行都会提交相应文件。
add -p只提交部分一个文件中的部分代码

git命令

把add的文件取消 从暂存区退回工作区

git rm --cached a.h// 就是删除暂存区的文件 并不是真的删除这个文件 而是让暂存区中没有文件 需要重新add

git restored --staged fileName // 将add了的文件变为没有add的 但是并不会将文件的修改还原 将暂存区的修改重新放回工作区(包括对文件自身的操作,如添加文件,删除文件) 

git restore fileName // 直接将文件中的修改还原 比如说加了一个a字母 他就会被还原 前提是这个修改没有被add到暂存区 要不然无效 
//丢弃工作区的修改 (不包括对文件自身的操作,如添加文件,删除文件) 

git reset HEAD  fileName// 丢弃暂存区的修改 重新放回工作区,会将暂存区的内容和本地已经提交的内容全部恢复到未暂存的状态,不影响原来本地文件(相当于撤销git add操作,不影响上一次commit后对本地文件的修改,)(包括对文件自身的操作,如添加文件,删除文件)

git reset commitID// 移动HEAD到指定提交点 ,当HEAD在绑定状态时,会同时移动HEAD关联的分支名,不会强制覆盖当前工作去的修改。HEAD分离时就只会移动HEAD。

git reset –hard  // 本地未提交的修改全部退回 将已经提交的内容的版本恢复到本地,本地的文件也将被恢复的版本替换(恢复到上一次commit后的状态,上一次commit后的修改也丢弃)当本地修个内容与远端库修改内容冲突 并且此时不要本地库就可以这样再pull 

git reset --hard commitID // 回滚到commitID的版本并且HEAD也会跟着移动

git revert

用一次新的提交会退以前的提交

commit 将文件从暂存区提交到本地库上

git commit -m “填写你修改的内容“    


git log// 查看log 可以获取做了哪些改动 这里可以获取改动编号
git log --graph //让log增加一点图形 主要是分支会有图形显示
git restore xxx // 恢复更改 丢弃更改 就会在xcode里面把你修改的内容都复原

clone

git clone xxxx.git --depth=1 // 克隆代码只克隆最近一次comit

branch

git branch // 查看本地分支 // +  // 创建一个名为branchName的branch // 

+ -d  // // 删除一个名为branchName的分支 如果该分支有提交未进行合并 则删除失败 // + -D  // 强制删除一个名为branchName的分支 如果该分支有提交未进行合并 则也会删除成功 // 

+ -vv // 查看当前分支与远程分支是否有差别 比如behind 144 就是说明当前分支比远程分支少了144个commit 如果少了就pull获取最新的 多了就push
+  -r //查看远程分支

git branch -m newName // 改名

git branch |grep "xxbranch"|xargs git branch -d//删除多个分支 grep "xxbranch"表示匹配到符合要求的 xargs表示在前面结果下 执行git branch -d命令
git设定简写 git config --global alias.xx aaa // 将aaa简写为xx

remote

git remote add 链接别名 远程仓库链接 // 注册远端数据库

// 将当前路径下本地数据库加到远程数据库[email protected]:gonsakon/xxx.git 并且取名叫name。 name是你随便取的别名,默认是origin  仓库链接就是仓库的URL

git remote -v // 查看本地库关联的远程仓库情况

push

git push -u 远程仓库链接别名 分支名称 // 将本地数据库的内容推到远程数据库中 -u指预设会推到哪个远端数据库服务 可以直接写git push 就是直接推到默认的(也就是上一次-u设置的那个数据库)

这个name 是可以被更改的

checkout 切换分支

git checkout branchName // 切换到当前分支 如果branchName与当前分支名一致 则Head回到最近一次commit

git checkout -b branchName // 创建并切换到该分支

git multi checkout x x x // 当前目录下所有包更改为xxx分支

git checkout commitID // 移动HEAD到指定提交点,但是与reset的区别就是他并不会移动HEAD关联的分支名,使得HEAD进入分离状态,如果在HEAD移动前后提交点不一样则会强制覆盖当前工作区的修改

git checkout -- fileName // 丢弃工作区的修改 并且还原最近一次commit 一定要加-- 要不然就是切换分支了

merge

git merge:接受两个commit指针,合并分支时是通过两个commit指针(这两个指针都要是指向各自分支的最新状态)追溯到两个分支最近的一次共同commit,然后创建一个新的merge commit在main分支上。(这个就是三路合并,分支的两个commit,共同祖先commit)

pull:

git pull = git fetch + git merge 

获取远程主机某个分支的更新,再与本地指定分支合并。
git pull <远程主机名><远程分支名>:<本地分支名

fetch

实际上是将分支的最新commit-id记录到.git/FETCH_HEAD中
然后就可以通过git merge FETCH_HEAD把这次commit merge过来
实际上 merge testBranch等驾驭merge 94054fc9104987b6eeeb317d3882daaf18997fcd
也就是FETCH_HEAD里面获取到的testBranch的最新的commit id
git-命令行_第1张图片

fetch和pull的不同

说白了就是full包括了fetch
fetch只是拿到最新的commit id 而pull是先拿到commit id 然后再merge进去 也就是会改变工作区的代码而fetch不会

Git fetch:Git fetch会将数据拉取到本地仓库 - 它并不会自动合并或修改当前的工作。
git pull:git pull是从远程获取最新版本并merge到本地,会自动合并或修改当前的工作。
commitID不同

Git fetch:使用Git fetch更新代码,本地的库中master的commitID不变,还是等于1。
git pull:使用git pull更新代码,本地的库中master的commitID发生改变,变成了2

git cherry-pick:把b分支的某个或者某几个commit提交到a分支上

例如:

git checkout A // 切换到A分支

git log // 查看分支要选择那个commit id 例如目标是comiit ID:abcde

git checkout B // 切换到B分支

git cherry-pick abcde// 将会生成一个新的提交,这个新的提交的hash值和原来的不同,但标志名称一样// 如果要提交A 到 B 的(左开右闭,不包含A)cherry-pick aID…bID // 包含A的话 aID^…bID

git stash // 将工作区内容进行备份

git stash pop // 恢复工作区内容

git rebase

git-命令行_第2张图片
此时在feature分支输入 git rebase master
然后会依次拿M和C、D内容分别比较,处理冲突后生成新的C’和D’。
然后就需要解决冲突 冲突解决完后需要git add这个冲突文件 再 git rebase --continue
git-命令行_第3张图片
然后下面两个绿色的CD就会消失 reature的指针会指在D’上
具体看这个 很详细
rebase讲解
git-命令行_第4张图片
我们只需要解决一次冲突 将c1,d1放1下面
在这里插入图片描述

参数

-i 弹出交互界面
再看看这个

git stash 一般用来解决冲突

将本地的所有修改暂时存储起来
比如你本地工作区改了代码 你可以先stash 就会将你这部分修改存储起来 这个时候pull或者merge是一定不会有问题的 pull之后再 git stash pop 将存储的那部分修改放出来 这个时候就可能会发现存储的修改和pull下来的代码修改了同一处 就需要去手动解决冲突

gd HEAD~ HEAD

查看代码提交后和远端的具体区别
gd是alias git diff
在HEAD后面加~或者^表示这个HEAD的父级 也就是拿上一次提交和当前改动做对比

功能

撤销

丢弃工作区

git checkout – aaa.txt //丢弃工作去的修改 一定要加–要不然就是切换分支了
本质是用本地仓库中的版本替换工作区的版本 就是保证工作区和本地仓库一致
所以如果工作区把这个文件删除了 如果本地仓库中有 也是可以恢复的

撤销暂存区

git reset HEAD aaa.txt //将aaa.txt从暂存区退回工作区

删除

git rm aaa.txt 等价于
先手动删除aaa.txt再git add aaa.txt 因为删除也是一种change 操作

创建本地分支

git branch newBranchName//此时并没有将head指针指向newBranchName 而是还在原分支 
git checkout newBranchName//此时指向了新分支

git checkout -b newBranchName//等价于上面两行

和远程仓库解除关联

git remote rm origin//当前本地仓库和远程仓库origin解除关联 真正要删除远程库需要区github上删除

查看远程关联仓库

git remote -v

git 基础概念

工作区就是.git的文件夹 直接在工作区新创建的 文件就是未被track的文件,

add之后就会对该文件track 此时该文件也进入了暂存区

commit 之后就进入了本地库

github 支持git代码存取和远程托管数据库的平台

Head 指向当前branch中的某个节点 大多出情况Head指向分支中的最新提交 Head可以指向分支名也可以指向提交点,指向分支名的是绑定状态,指向提交点的是分离状态

branch

master分支: git在首次创建repo时为您创建的默认分支的名称 也是主分支,所有用户可见的正式版本都是从Master发布的,一般由develop和hotfix分支合并而成

develop分支:开发分支

feature分支:临时性多功能分支 开发新功能时以develop为基础创建feature分支,开发完成后merge会develop分支

hotfix分支:修补bug的分支,从master拉取,修复并测试完成merge回master和develop。如果修复期间,有其他版本合并入master ,需要同步到fixbug版本,并进行测试

release分支:预发布分支,用于QA测试。从develop拉取,测试完成merge回master和develop

origin  为主远程仓库提供的默认名称

合并冲突

合并冲突:当使用merge时发现两个分支中都有对同一个文件同一部分代码有修改,此时git无法缺少应该使用哪个版本。 当出现这个时

<<<<<<< Abranch
aaaa
=======
bbbb
>>>>>>>>>Bbranch

就能知道是具体哪两个分支冲突,====== 标记之前的内容来自于接收合并的分支,而在这之后的内容来自于要合并的分支。

git-命令行_第5张图片

比如 HEAD 的a.h文件是

在第一行写的是master

testBranch的a.h文件是

在第一行写的testBtanch

此时merge就不知道应该是按照bbranch来还是abranch

问题:比如说当前工作分支是A 目标分支B merge之后 B分支的最新commit是merge commit吗

repository:远端数据库

另一种方法

如何解决git conflict

git stash push
然后git pull
再git pop

检查空格

git diff --check

问题:

1.需要细致的了解Head,master,origin

2.git rebasing(快速合并)?

.git文件中的.refs可以看到当前head指向的位置

你可能感兴趣的:(git,git,windows)