git常用指令

•Workspace:工作区

•Index / Stage:暂存区

•Repository:仓库区(或本地仓库)

•Remote:远程仓库

一、新建代码库

  • git clone [url] ------ 下载一个项目和它的整个代码历史

二、配置

  • git config --list ------ 显示当前的Git配置
  • git config --global user.name "[name]" ------ 设置提交代码时的用户名
  • git config --global user.email "[email address]" ------ 设置提交代码时的用户邮箱

三、查看信息

  • git status ------ 查看有变更的文件
  • git log ------ 显示当前分支的版本历史,所有提交过的版本信息
  • git log --stat ------ 显示commit历史以及每次commit发生变更的文件
  • git log --p [file] ------ 显示指定文件相关的每次diff
  • git diff ------ 显示暂存区和工作区的差异
  • git diff [file] ------ 显示指定文件的差异
  • git reflog ------ 显示所有分支的所有操作记录,包括被删除的commit记录和reset的操作,可以用于回退到一些被删除的版本
  • git blame ------ 用于逐行显示文件最后修改的提交、作者和时间等信息的命令‌,常用于代码历史追溯和问题定位 例如:git blame src/drivers/driver_nl80211.c | grep use_monitor 查询use_monitor 在driver_nl80211.c中的变化情况

四、代码提交

  • git add [file1] [file2] ... ------ 添加指定文件到暂存区
  • git add [dir] ------ 添加指定目录到暂存区,包括子目录
  • git rm [file1] [file2] ... ------ 删除工作区文件,并且将这次删除放入暂存区
  • git commit -m [message] ------ 提交暂存区到仓库区
  • git commit --amend -m [message] ------ 使用一次新的commit,替代上一次提交,如果代码没有任何变化,则用来改写上一次commit的提交信息
  • git commit --amend [file1] [file2] ... ------ 重做上一次commit,并包括指定文件的新变化

五、分支

  • git branch ------ 列出所有本地分支
  • git branch -r ------ 列出所有远程分支
  • git branch [branch-name] ------ 新建一个分支,但依然停留在当前分支
  • git checkout -b [branch] ------ 新建一个分支,并切换到该分支
  • git branch [branch] [commit] ------ 新建一个分支,指向指定commit
  • git checkout [branch-name] ------ 切换到指定分支,并更新工作区
  • git branch --set-upstream [branch] [remote-branch] ------ 在现有分支与指定的远程分支之间建立追踪关系
  • git cherry-pick [commit] ------ 选择一个commit,合并进当前分支

(cherry-pick的冲突解决:

1.解决完一个补丁应用的冲突后,执行下面命令标记冲突已解决(也就是把修改内容加入缓存):git add -u //注:-u 表示把所有已track的文件的新的修改加入缓存,但不加入新的文件。

2.然后执行下面命令继续rebase:git cherry-pick --continue //有冲突继续解决,重复这这些步骤,直到cherry-pick完成。

3.如果中间遇到某个补丁不需要应用,可以用下面命令忽略:git cherry-pick --skip

4.如果想回到rebase执行之前的状态,可以执行:git cherry-pick --abort //放弃cherry-pick

注:cherry-pick之后,不需要执行commit,也不存在新的修改需要提交,都是git自动完成。直接git push即可)

  • git branch -d [branch-name] ------ 删除分支
  • git push origin --delete [branch-name] ------ 删除远程分支

六、远程同步

  • git checkout -b dev_local_xxxx remotes/origin/master ------ 以master分支创建自己的开发分支
  • git pull [remote branch] ------ 拉取远程仓库的变化,并与本地分支合并
  • git pull --rebase ------ 如果该开发分支也有其他合作者,采用该方式拉取最新提交
  • git rebase remotes/origin/master ------ 更新远程master主分支的提交到本地分支

rebase的冲突解决

1.解决完一个补丁应用的冲突后,执行下面命令标记冲突已解决(也就是把修改内容加入缓存):git add -u //注:-u 表示把所有已track的文件的新的修改加入缓存,但不加入新的文件。

2.然后执行下面命令继续rebase:git rebase --continue //有冲突继续解决,重复这这些步骤,直到rebase完成。

3.如果中间遇到某个补丁不需要应用,可以用下面命令忽略:git rebase --skip

4.如果想回到rebase执行之前的状态,可以执行:git rebase --abort //放弃rebase

注:rebase之后,不需要执行commit,也不存在新的修改需要提交,都是git自动完成。需要通过git push --force提交

  • git fetch [remote] ------ 下载远程仓库的所有变动
  • git push [remote branch] ------ 上传本地指定分支到远程仓库
  • git push --force [remote branch] ------ 强行推送当前分支到远程仓库,即使有冲突,该功能谨慎使用

七、撤销与暂存 (stash)

  • git checkout [file] ------ 恢复暂存区的指定文件到工作区

  • git checkout [commit] [file] ------ 恢复某个commit的指定文件到暂存区和工作区

  • git reset [file] ------ 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变

  • git reset --hard ------ 重置暂存区与工作区,与上一次commit保持一致,谨慎使用

  • git reset --hard [commit] ------ 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致

  • git revert [commit] ------ 新建一个commit,用来撤销指定commit,后者的所有变化都将被前者抵消,并且应用到当前分支

  • git reset HEAD ------ 可以清空之前git add 的内容

  • git stash save "save message" ------ 将当前工作区的修改暂时存储到堆栈区,建议添加备注,方便查找

  • git stash list ------ 查看stash了哪些存储

  • git stash show ------ 做了哪些改动,默认show第一个存储,如果要显示其他存贮,后面加stash@{$num},比如第二个 git stash show stash@{1}

  • git stash apply ------ 应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即stash@{0},如果要使用其他个,git stash apply stash@{$num} , 比如第二个:git stash apply stash@{1}

  • git stash pop ------ 命令恢复之前缓存的工作目录,将缓存堆栈中的对应stash删除,并将对应修改应用到当前的工作目录下,默认为第一个stash,即stash@{0},如果要应用并删除其他stash,命令:git stash pop stash@{$num} ,比如应用并删除第二个:git stash pop stash@{1}

  • git stash drop stash@{num} ------ 丢弃stash@{num}存储,从列表中删除这个存储

  • git stash clear :删除所有缓存的stash

以上stash相关,没有在git 版本控制中的文件,是不能被git stash 存起来的

  • 如果想要将远程仓库的某些最近的提交取消掉,可以通过如下步骤(该功能慎用):

1.git reset --soft [commit] ------将工作区的文件回退到目标版本,但不会改变暂存区的状态

2.git push --force [remote branch] ------ 强制将工作区推送到远程分

八、tag

  • git tag ------ 列出所有tag
  • git tag [tag] ------ 新建一个tag在当前commit
  • git tag [tag] [commit] ------ 新建一个tag在指定commit
  • git tag -d [tag] ------ 删除本地tag
  • git show [tag] ------ 查看tag信息
  • git push [remote] [tag] ------ 提交指定tag
  • git checkout -b [branch] [tag] ------ 新建一个分支,指向某个tag

九、其他

  • git merge与 git rebase区别

git merge:将两个分支,合并提交为一个新提交,并且新提交有2个parent。

git rebase:会取消分支中的每个提交,并把他们临时存放,然后把当前分支更新到最新的origin分支,最后再把所有提交应用到分支上。

  • 将多次提交合并成一个

1.git rebase -i HEAD~2 (HEAD~2表示近2次提交都合并)

2.然后进入编辑界面,编辑界面有提交记录以及合并命令的详细说明,将第二个pick c6da035 ~~改成squash c6da035 ~~,然后保存退出,这样git log中可以看到本地仓库近2次提交被合并成了一个

3.git push [remote branch]将本地仓库推送到远端仓库

相关推荐
华科大胡子2 小时前
开源项目 Git 贡献全流程拆解
git
极地星光2 小时前
工程中:Git 子模块(submodule) vs 直接依赖(源码/库/包管理器)
git
无限进步_3 小时前
【C++&string】大数相乘算法详解:从字符串加法到乘法实现
java·开发语言·c++·git·算法·github·visual studio
无限进步_4 小时前
【C++】验证回文字符串:高效算法详解与优化
java·开发语言·c++·git·算法·github·visual studio
无限进步_7 小时前
【C++】重载、重写和重定义的区别详解
c语言·开发语言·c++·ide·windows·git·github
历程里程碑7 小时前
1 . Git本地操作:版本控制 跨平台协作 仓库核心
java·开发语言·数据结构·c++·git·gitee·github
华科大胡子8 小时前
Git + 云原生
git
johnny2338 小时前
Git拓展:GitButler、Gitnuro、JGit
git
王的宝库9 小时前
GitLab 常用 Git 命令新手指南
git·学习