来源:常用Git命令
Remote:远程仓库,是最旧的。
Repository:仓库区(或本地仓库)。
Index / Stage:暂存区,当前工作区中,通过git add先提交到暂存区,被git管理。
Workspace:工作区, 程序员进行开发改动的地方,是你当前看到的,也是最新的。
不定时更新签名:
/8250-modem/vendor/xiaomi/securebootsigner$ git fetch --all
~/8250-modem/vendor/xiaomi/securebootsigner$ git checkout remotes/miui/sectool-mi-dev
git查询修改
git status 显示有变更的文件
git log 显示当前分支的版本历史
git log --pretty=oneline 显示从最近到最远的提交日志
git log --oneline 单行显示提交
git log --author=“author” 可以查找某一个作者所有的提交
git reflog 用来记录你的每一次命令,并且可恢复
git log --stat 显示commit历史,以及每次commit发生变更的文件
git log -S [keyword] 搜索提交历史,根据关键词
git log [tag] HEAD --pretty=format:%s 显示某个commit之后的所有变动,每个commit占据一行
git log [tag] HEAD --grep feature 显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件
git log --follow [file] 显示某个文件的版本历史,包括文件改名
git whatchanged [file] 显示某个文件的版本历史,包括文件改名???
git log -p [file] 显示指定文件相关的每一次diff
git log -5 --pretty --oneline 显示过去5次提交
git shortlog -sn 显示所有提交过的用户,按提交次数排序
git blame [file] 显示指定文件是什么人在什么时间修改过
git diff 显示工作区的修改
git diff --cached [file] 显示暂存区和工作区的差异
git diff HEAD 显示工作区与当前分支最新commit之间的差异
git diff [first-branch]...[second-branch] 显示两次提交之间的差异
git diff --shortstat "@{0 day ago}" 显示今天你写了多少行代码
git show [commit] 显示某次提交的元数据和内容变化
git show --name-only [commit] 显示某次提交发生变化的文件
git show [commit]:[filename] 显示某次提交时,某个文件的内容
git branch 查看目前所在分支
git status/git show 查看一下修改状态
git am -3 -k --ignore-whitespace ../../../../../../368a1f5.diff 合并修改
git am --abort
git add操作--将工作区修改的内容提交到暂存区,交由git管理
git add 当前目录的所有文件到缓存区
git add <dir> 添加指定目录到暂存区,包括子目录
git add [file1] [file2] ... 添加指定文件到暂存区
git add . 添加当前目录的所有文件到暂存区
git add -p 添加每个变化前,都会要求确认 ,对于同一个文件的多处变化,可以实现分次提交????
git rm [file1] [file2] ... 删除工作区文件,并且将这次删除放入暂存区
git rm --cached [file] 停止暂存指定文件,但该文件会保留在工作区
git mv [file-original] [file-renamed] 改名文件,并且将这个改名放入暂存区
git reset HEAD <file> 取消add操作并保留修改
git checkout -- <file> 若继续该命令,则会删除掉刚刚的修改内容
git commit操作--将暂存区的内容提交到本地仓库,并使得当前分支的HEAD向后移动一个提交点。
git commit -s (--amend) 添加到版本库(-m 添加描述) 第一次就要用-s
git commit -m "wrote a readme file" 把文件提交到仓库
git commit -m <message> 提交暂存区到本地仓库,message代表说明信息
git commit --amend -m <message> 使用一次新的commit,替代上一次提交,如果代码没有任何新变化,则用来改写上一次commit的提交信息
git commit [file1] [file2] ... -m [message] 提交暂存区的指定文件到本地仓库
git commit -a 提交工作区自上次commit之后的变化,直接到本地仓库
git commit -v 提交时显示所有diff信息
git commit --amend [file1] [file2] … 重做上一次commit,并包括指定文件的新变化
git reset --soft <commit_id> 可以回退到某个commit并保存之前的修改
git reset --hard <commit_id> 回退到某个commit不保留之前的修改
git push--上传本地仓库分支到远程仓库分支,实现同步
git push <remote><branch> 上传本地指定分支到远程仓库
git push <remote> --force 强行推送当前分支到远程仓库,即使有冲突
git push <remote> --all 推送所有分支到远程仓库
git revert <commit_id> 撤销Git push操作
git push -u origin master 把当前分支master推送到远程
git push origin master 把本地master分支的最新修改推送至GitHub
git reset--把当前分支指向另一个位置,并且相应的变动工作区和暂存区。
git reset --hard HEAD^ (HEAD~100也可以)回退到上一个版本
git reset HEAD <file> 可以把暂存区的修改撤销掉,重新放回工作区
git reset --soft <commit> 只改变提交点,暂存区和工作目录的内容都不改变
git reset --mixed <commit> 改变提交点,同时改变暂存区的内容
git reset --hard <commit> 暂存区、工作区的内容都会被修改到与提交点完全一致的状态
git reset --hard HEAD 让工作区回到上次提交时的状态
git reset [file] 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
git reset [commit] 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
git reset --keep [commit] 重置当前HEAD为指定commit,但保持暂存区和工作区不变
git revert–用一个新提交来消除一个历史提交所做的任何修改。
git revert [commit] 新建一个commit,用来撤销指定commit, 后者的所有变化都将被前者抵消,并且应用到当前分支
revert与reset的区别:
git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。在回滚这一操作上看,效果差不多。但是在日后继续merge以前的老版本时有区别。因为git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现,减少冲突。但是git reset是之间把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入,产生很多冲突。
git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。
git checkout
git checkout -- readme.txt 把readme.txt文件在工作区的修改全部撤销
git checkout 其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”
git checkout [file] 恢复暂存区的指定文件到工作区
git checkout [commit] [file] 恢复某个commit的指定文件到暂存区和工作区
git checkout . 恢复暂存区的所有文件到工作区 $
git checkout -b <branch-name> 新建一个分支,并切换到该分支
git checkout -b <branch-name> <remote> 新建一个分支,并切换到该分支,并与远程分支绑定
git merge–把不同的分支合并起来
在实际开发中,我们可能从master分支中切出一个分支,然后进行开发完成需求,中间经过R3,R4,R5的commit记录,最后开发完成需要合入master中,这便用到了merge。一般在merge之后,会出现conflict,需要针对冲突情况,手动解除冲突。主要是因为两个用户修改了同一文件的同一块区域。
git fetch <remote> merge之前先拉一下远程仓库最新代码
git merge <branch> 合并指定分支到当前分支
git rebase又称为衍合,是合并的另外一种选择。rebase也需要手动解决冲突
git rebase dev 在开始阶段,我们处于new分支上,那么new分支上新的commit都在master分支上重演一遍,最后checkout切换回到new分支。这一点与merge是一样的,合并前后所处的分支并没有改变。通俗的解释就是new分支想站在dev的肩膀上继续下去。
git rebase -i pre_commitid 在原有commit顺序基础上修改指定的commitid
git rebase --continue 将commit及其之后的代码提交重新合并到工作分支。
merge与rebase的区别:
现在我们有这样的两个分支,test和master,提交如下:
D---E test
/
A---B---C---F master
在master执行git merge test,然后会得到如下结果:
D------E
/ \
A---B---C---F------------------G test, master
在master执行git rebase test,然后得到如下结果:
A---B---C---F---D'---E' test, master
可以看到,merge操作会生成一个新的节点,之前的提交分开显示。而rebase操作不会生成新的节点,是将两个分支融合成一个线性的提交。
如果你想要一个干净的,没有merge commit的线性历史树,那么你应该选择git rebase。
如果你想保留完整的历史记录,避免重写commit history的风险,你应该选择使用git merge。
git branch--涉及到协作,自然会涉及到分支,大概有展示分支,切换分支,创建分支,删除分支这四种操作
git branch 列出所有本地分支
git branch -r 列出所有远程分支
git branch -a 列出所有本地分支和远程分支
git branch <branch-name> 新建一个分支,但依然停留在当前分支
git branch --track <branch><remote-branch> 新建一个分支,与指定的远程分支建立追踪关系
git checkout <branch-name> 切换到指定分支,并更新工作区
git branch -d <branch-name> 删除分支
git push origin --delete <branch-name> 删除远程分支
git branch [branch] [commit] 新建一个分支,指向指定commit
git checkout - 切换到上一个分支
git branch --set-upstream [branch] [remote-branch] 建立追踪关系,在现有分支与指定的远程分支之间
git merge [branch] 合并指定分支到当前分支
git cherry-pick [commit] 选择一个commit,合并进当前分支
git remote--远程仓库操作
git remote -v 显示所有远程仓库
git remote show [remote] 显示某个远程仓库的信息
git remote add [shortname] [url] 增加一个新的远程仓库,并命名
git二分查找
# git bisect start 首先告诉git我们要開始binary search了。
#git bisect bad 告诉git当前的commit是一个坏的提交
#git bisect good ad5e0 再告诉git我们已知的一个好的提交,这样子git就知道開始和结束的位置了,然后git会reset到中间的commit。
#git bisect good 这时候我们就位于中间到一个commit。我们能够编译执行看看执行结果。假设是好的。我们告诉git是好的。
#git bisect bad 假设是坏的,我们告诉git是坏的。
就这样,你能够在lg(n)次找到第一个坏的commit。git找到后会给你打印出此commit的信息。
# git bisect reset 找到这个commit之后,不要忘记退出bisect。
其它指令
git fetch [remote] 下载远程仓库的所有变动
git clean -df 强制删除未被追踪的文件,(删除编译产物)
git pull [remote] [branch] 取回远程仓库的变化,并与本地分支合并
git cherry-pick <commit> 选择一个commit,合并进当前分支
git init 初始化一个Git仓库
repo forall -c 'echo ====$REPO_PROJECT===;git checkout -b after-adapt;' 对所有的工程都新建一个分支,分支名为 after-adapt
repo forall -c 'echo ====$REPO_PROJECT===;git checkout -f stable;git reset --hard HEAD;git pull;'
repo forall -c 'echo ====$REPO_PROJECT===;git checkout -f new;git stash;git reset --hard HEAD^;git pull;git stash pop;'
repo forall -c 'echo ====$REPO_PROJECT===;git checkout -f stable;git stash;git reset --hard HEAD^;git pull;git stash pop;'
repo forall -c 'echo ====$REPO_PROJECT===;git reset --hard && git clean -df;'
git stash 暂时将未提交的变化移除,即删除修改
git stash pop 稍后再移入
repo start new --all 为每一个仓库建立new分支,并追踪远程分支
repo sync -c --no-tags -j4 下载git仓库的时候,仅下载manifest中该仓库revision分支,其他分支不下载;不下载tags,提高下载速度
repo update ./
repo sync --force-sync
2020.11.5
git checkout --track miui/bsp-umi-r
(git checkout -b 05398129-mspl miui/bsp-qcom-r)
git pull
repo start patch1
修改后:
git add .
git commit -s (填写相应描述)
#git commit --amend (与上一个提交合并,仅用于上一个提交是自己 刚提交的)
repo upload --no-verify
解决冲突:git pull --rebase
1.新建一个最新的分支,同步远程仓
2.下载要解决冲突的patch:
git fetch ssh://gaoce@git.mioffice.cn:29418/vendor/xiaomi/modem_mbn 56a811c8d9ed6ffebf55ca33a4cdadbaa39aeffa && git reset --hard FETCH_HEAD
3.使用git pull合并
4.解提示的冲突,如:
warning: 抑制下仍有 2 个空白字符误用
warning: 7 行有空白字符误用。
回落到基础版本上打补丁及进行三方合并...
自动合并 xmbn/version/China/CT/Version.xml
冲突(内容):合并冲突于 xmbn/version/China/CT/Version.xml
自动合并 xmbn/common/mmcp/config/China/CU/mcfg_sw_gen_VoLTE-Commercial.xml
冲突(内容):合并冲突于 xmbn/common/mmcp/config/China/CU/mcfg_sw_gen_VoLTE-Commercial.xml
自动合并 xmbn/common/mmcp/config/China/CT/mcfg_sw_gen_hVoLTE_OpenMkt-Commercial.xml
冲突(内容):合并冲突于 xmbn/common/mmcp/config/China/CT/mcfg_sw_gen_hVoLTE_OpenMkt-Commercial.xml
自动合并 xmbn/common/mmcp/config/China/CMCC/mcfg_sw_gen_Volte_OpenMkt-Commercial.xml
冲突(内容):合并冲突于 xmbn/common/mmcp/config/China/CMCC/mcfg_sw_gen_Volte_OpenMkt-Commercial.xml
自动合并 xmbn/common/dataims/Configuration/NVConfigGroups/SIP/China/CU/overideconfig
自动合并 xmbn/common/dataims/Configuration/NVConfigGroups/SIP/China/CT/overideconfig
自动合并 xmbn/common/dataims/Configuration/NVConfigGroups/SIP/China/CMCC/OpenMktCommercial/overideconfig
5.git rebase --continue
6.git add .
7.git rebase --continue
8.repo upload --no-verify