GIT的使用步骤
各分支名称都是个指针指向自己的分支的版本号 HEAD也是个指针 是各分支公用的 指向刚操作过的分支最新版本号
提交id是分支名的指针指向的id 可通过git reset --hard 版本号 修改提交id 默认是最新的id
已经在暂存区的称为staged
未加入过暂存 新建的文件 被称为Untracked
文件先加入暂存区才能 git stash 从stash出来的文件在工作区和暂存区都有
打patch:先git fetch 到主分支 再git rebase master到其他分支 patch下来的文件在工作区和暂存区
(所有git命令都以git开头)
-
在~目录下输入:ssh-keygen 不断回车 会生成公私钥存放在.ssh文件中
-
在~目录下输入:ls -a 找到.ssh文件 复制其公钥 然后在github上粘贴其公钥(使用ssh的好处:执行git push时不用重复输入用户名和密码 传输速度快)
-
在~目录下输入:git clone 仓库地址算法(链接的结尾git是不需要的)
-
cd 进入拉下来的项目文件
-
git status 查看文件状态
-
git add – 文件名 把有修改或者新增文件加到暂存区
git add . 一次性全部文件
git rm 删除文件
Changes not staged for commit–改变还没有被暂存 staged意思是暂存的 -
git reset – 文件名 撤销add到暂存区的文件
git reset 撤销全部 -
git diff 查看工作区内被跟踪文件的修改详情(只有在版本区的文件才 是被跟踪的)
-
git commit 把暂存区的修改提交到版本区生成一个新的版本
git commit -m ‘提交的备注’
git log 查看当前所在分支的提交历史记录
git log 分支名 查看指定分支的提交历史记录
git log --名字 查看指定贡献者的提交历史记录
git log --graph 图示法显示提交历史 -
git config --global user.email “邮箱”
git config --global user.name “账户名” -
git push 将新增推到远程GitHub仓库(只有push是需要联网执行的 其他都在本地)
push详解
13.git reset 就是控制分支名指针的指向 让其指向相应的版本号
//对于已经commit的想要撤销回退到之前的版本
git reset
//显示所有版本
git reflog
//转换到相应版本 工作区刚写的修改还保留 提交id不变
git reset --版本号
//转到相应版本 工作区刚写的修改不保留 工作区也是那个版本的内容 提交i回退
git reset --hard版本号
//会退到前一个版本
git reset --HEAD^
//回退到最近两次提交版本变化前
git reset --hard HEAD@{2}
//撤销刚刚add到暂存区还没commit的内容 保留工作区的修改
git reset HEAD
//撤销add到暂存区还没commit的内容 并且工作区的修改也撤销
git reset --hard HEAD
//撤销add到暂存的的指定file
git reset HEAD file
//撤销工作区的修改
git checkout -- file
//撤销工作区所有修改 保存暂存区的
git restore
拉取远程仓库到本地用:git pull
HEAD是当前的意思
代码commit的时候用git commit --amend就不会生成新的版本了
16.分支的操作 各分支名称都是个指针指向自己的分支的版本号 HEAD也是个指针 是各分支公用的 指向刚操作过的版本号
git branch dev//创建分支dev
git checkout -b dev //创建并切换到分支dev
git checkout -f dev /强制切换 如果提示有些红色文件未保存
git checkout dev //切换到分支dev
git branch -d dev //删除分支dev
git merge dev //合并分支到master
git cherry-pick
如果1分支上的当前版本d需要2分支上的一个版本f的功能 --那么就产生了转移分支操作
git checkout 1 //先切换到1分支
git cherry-pick 版本号 //挑选版本到当前分支 此时1分支会产生一个新的提交
git cherry-pick <HashA> <HashB>//一下转移多个提交
git cherry-pick -n //只更新工作区和暂存区 不产生新的提交
//假如会有三个文件会冲突 逐步pick过来
git cherry-pick ..
//pick过来第一个冲突的文件 在编辑器解决冲突 然后
git add git cherry-pick --continue
//会接着pick后面的文件 继续重复上面的
//类似git rebase .. 冲突了就处理冲突 再接着 git rabase --continue
提交id是分支名的指针指向的id
刚开始做一个feature 不能先建分支 再master更新 再在特征分支git cherry-pick 这样提交代码会提交到pick过来的最新代码的最后一次修改的patch的远程 不是总代码的远程 在分支pick过来什么 提交就提交到pick对应的远程
如果把拿过来的东西变成自己的提交 想git commit --amend时候到自己的版本 用git checkout
**如果只是把拿过来的东西用一下不提交 用git commit **
如果想提交到前面的commit版本对应的patch上 要先切换分支名指针指向的版本号 git reset --hard版本号(git reset 版本号不行) 再git commit --amend
分支已经更改了 单分支不是基于最新代码 出现merge conflict 需要处理冲突
//切换到master
git pull
//新建分支 并切换到新分支
git checkout -b newbra
//打上已经改好的分支的patch
git fetch ssh://int.rui.xue@gerrit.enflame.cn:29418/tops refs/changes/87/49487/11 && git cherry-pick FETCH_HEAD
//处理冲突
//再提交会提交到对应patch上
git commit
``
因为git push 是把代码push到HEAD指针指向的版本对应的远程 git cherry-pick后 HEAD指向的是pick过来的版本号
git checkout master
git pull
//建立新分支
git checkout -b IDC-15-1230
//写新特征
git commit
git push origin HEAD:refs/for/master
修改一个feature的时候
//在此feature的分支修改
git add
git commit -amend
git push origin HEAD:refs/for/master
打patch
//有冲突的地方 需要处理冲突
git fetch ssh://int.rui.xue@gerrit.enflame.cn:29418/tops refs/changes/87/49487/11 && git cherry-pick FETCH_HEAD
//直接覆盖原代码
git fetch ssh://int.rui.xue@gerrit.enflame.cn:29418/tops refs/changes/87/49487/11 && git checkout FETCH_HEAD
代码push时出现cpplint问题 用 ,格式化一下文件
clang-format -i file
git rebase的功能:①合并版本 ②把其他分支内容搬到此分支
https://www.jianshu.com/p/4a8f4af4e803
https://blog.youkuaiyun.com/weixin_42310154/article/details/119004977
https://blog.youkuaiyun.com/Maxiao1204/article/details/114107695?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-114107695-blog-119004977.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-114107695-blog-119004977.pc_relevant_default&utm_relevant_index=1
将不同的commit版本合并
git rebase -i [startpoint] [endpoint]
区间为[[startpoint] , [endpoint]) 左边是最近的 右边是最远的左闭右开
也可表示为
git rebase -i HEAD~3
算上HEAD 往前数三个
//error: you need to resolve your current index first 需要先合并冲突
git pull时出现
error: Your local changes to the following files would be overwritten by merge:
可用git stash
**git stash**
命令的作用就是将目前还不想提交的但是已经修改的内容进行保存至堆栈中 必须是tracked的才能进stash 新加的没提交过的不能进stash 但是会随着分支切换直接进入下一个分支
git stash //将编译器上的内容暂存在堆栈中
git stash save “注释” //把东西存起 并起个注释
git stash list //查看暂存内容
git pull
git pop //把堆栈中的内容拿出来并清空 并放到此分支
git stash apply //拿出来栈里的全部内容 不清空 并可先切换分支 应用到其他分支
git stash apply stash@{0} //拿出来栈里编号为0内容 (如果在其他分支应用不是此分支的东西 那么会切换回另一个分支)
**git cherry-pick**
[详解](http://www.ruanyifeng.com/blog/2020/04/git-cherry-pick.html)
git commit后提交代码前
工作区可以不保留 直接–hard
更新分支的代码为最新:
将master分支的代码更新到开发分支上
master上别人提交了新的代码需要同步到自己的开发分支上
更新分支代码
方法一:切换到master分支 git pull 切换回分支 git rebase master
git add .
git commit -m “提交代码”
git push origin dev
切换到master分支,拉取master上最新的代码
git checkout master
git pull
切换到开发分支上
git checkout dev
将master代码合并到开发分支上
git merge master
有冲突解决合并时候的冲突
提交合并后的代码到dev
git commit -m “解决冲突”
git push origin dev
在一个分支怎么提交到不同的 cherry-pick 过来的patch
先 git reflog 找到想要提交到的patch的 cherry-pick下来时的版本号
git reset 版本号
git commit --amend
想要把别人的代码cherr-pick下来变成自己的 或者想把自己的patch重新提交到新的patch上(也就是在pick下来的代码 git status中出现在红色修改里)
先cherr-pick
再git reset 到cherr-pick前的版本号
fatal: You are in the middle of a cherry-pick – cannot amend.—直接commit
push的时候[remote rejected] HEAD -> refs/for/master :
git reflog
git reset 到cherr-pick之前的版本
新提交的代码merge conflict
切换到master git pull
切换到分支 git rebase master
遇到冲突 解决冲突
git add 解决过冲突的文件
git rebase --continue
git commit --amend
git push
cherry-pick出现问题
cd top/.git
chown -R rui.xue:rui.xue *