Git常用命令
git 概述
了解Git之前, 这些基本的概念的了解:
- Workspace:工作区
- Index / Stage:暂存区
- Repository:仓库区(或本地仓库)
- Remote:远程仓库
git 命令
最基本的命令(结构图上的命令)这里就不赘述了, 记录一下不是特别常用命令以及解决某种场景下需要使用的命令:
- 格式化日志输出格式;
git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
- 日志输出格式格式化别名设置;
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative"
设置之后就可以使用git lg来查看日志了; 查看效果如下, 是不是更加的简洁:
- git还有一些显示方面的设置:
//开启git着色功能 git config --global color.ui true //设置显示中文文件名 git config --global core.quotepath false
- 显示当前Git配置
git config --list
- checkout命令
git checkout dev //切换到dev分支 git checkout v1.0 //切换到v1.0版本(却换tag) git checkout 05ea12f //后面加commit_id, 每次提交之后的sha1值, 可以使用git log看到
- 强制覆盖本地
//清除本地缓存 git reset --hard //拉去代码 git pull
- 丢弃工作区修改
-
未
git add
的修改文件, 舍弃修改;如果你发现工作区文件
CMakeList.txt
中一部分修改需要舍弃, 需要手动恢复到上一个版本状态.git checkout -- CMakeList.txt
-
已经
git add
的修改文件, 舍弃;git reset HEAD filename
-
-
查看所有被修改过的, 未提交的文件
$ git add -i . staged unstaged path 1: +13/-10 nothing module/log/logging.cc 2: +16/-21 nothing module/log/logging.h 3: +1/-1 nothing module/log/sinks.h 4: +15/-7 nothing module/log/tests/CMakeLists.txt 5: +39/-8 nothing module/log/tests/logging_test.cc *** Commands *** 1: status 2: update 3: revert 4: add untracked 5: patch 6: diff 7: quit 8: help
- 存储你的工作
-
git stash
如果你已经做了修改, 此时需要切换分支, 但你又不想提交代码; 你就可以存储你的变更; 往堆栈推送一个新的存储;
-
git stash list
查看存储列表;
$ git stash list stash@{0}: WIP on master: 049d078 added the index file stash@{1}: WIP on master: c264051 Revert "added file_size" stash@{2}: WIP on master: 21d80a5 added number to log
-
git stash apply
你可以重新应用你刚才保存的存储
git stash apply stash@{2}
-
取消存储(stash@{0})
git stash show -p stash@{0} | git apply -R
-
- 同一个分支, 同一个文件,远程已经修改, 本地也修改
当你提交这个文件时候, 会提示如下:
error: Your local changes to the following files would be overwritten by merge:
Please, commit your changes or stash them before you can merge.
解决方式:
- git stash 保存本地修改
- git pull 更新
- git stash pop 还原保存的本地修改, 实现自动合并;
- git diff -w <文件名>; 来查看代码自动合并的情况;文件名>
git分支
- 创建分支
//创建分支
git branch dev
//创建分支cdev 并切换到分支cdev
git checkout -b cdev
- 查看分支
//查看所有分支
$ git branch -a
* cdev
dev
master
remotes/origin/HEAD -> origin/master
remotes/origin/master
//查看远程分支
$ git branch -r
origin/HEAD -> origin/master
origin/master
//查看本地分支
$ git branch
* cdev
dev
master
- 切换到指定分支
//切换到分支dev上
git checkout dev
- 分支合并到当前分支
//如果当前分支是master, 合并cdev到master上
git merge cdev
- 删除分支
//删除本地分支dev
git branch -d dev
//删除远程分支dev
git push origin --delete dev
- 重命名远程分支
重命名远程分支需要经过一下几个步骤:
- 删除远程分支;
git push –delete origin cdev
- 重名本地分支;
git branch -m cdev game_dev
- 推送本地分支;
git push origin game_dev
- 删除远程分支;
git标签
我们每次提交代码都会生成一串字符ID, 如下:
f9fee7d4ae12d45881e44d61fdd588846f2a5c6c
这个在正常的开发过程中, 无所谓, 也不会关心, 但是如果发布了几个版本之后, 要找回某个版本, 这个时候通过提交信息来找会非常痛苦; 使用标签就很好的解决了这个问题!
标签分为两种:
- 轻量标签:只是对某次提交的一个引用,也就是说,也就是一串比较好记的id;
- 附注标签:是一个独立的对象,也就是说会存有一分独立的代码,类似一个分支;
使用
- 查看全部tag
git tag
- 打轻量标签
git tag v1.0
- 附注标签
git tag -a v2.0 -m "release version2.0"
- 后期打标签
//2bcfb4d009 是commit id
git tag -a v0.1 2bcfb4d009
- 显示标签信息
//显示标签2.0 详细信息
git show v2.0
- 通过特定模式列出标签
$ git tag -l 'v1.8.5*'
v1.8.5
v1.8.5-rc0
v1.8.5-rc1
v1.8.5.1
v1.8.5.2
- 提交标签
//提交全部标签
git push [remote] [tag]
//如下:
git push origin v1.0
//提交全部标签
git push origin --tags
- 删除标签
//删除本地标签
git tag -d [tag]
git tag -d v1.0
//删除本地标签
git push origin --delete tag <tagname>
detached状态说明
“head detached”状态就是head指针游离状态, 当远程分支对应的本地分支不存在时候, 而你直接使用了git checkout remotes/origin/game_dev;
$ git checkout remotes/origin/game_dev
Note: checking out 'remotes/origin/game_dev'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b <new-branch-name>
HEAD is now at 004ba82... game dev add test many branches merge
evancui@evancui MINGW64 /d/code/linux_prj/C++/git/test ((004ba82...))
$
出现”head detached”状态是危险的, 解决方式:
//切换到分支game_dev并创建本地分支
git checkout -t game_dev
git cherry-pick命令介绍
git cherry-pick用于把另一个本地分支的commit修改应用到当前分支。
问题:
在本地 master分支上做了一个commit(3e0b3fdffda9e92bad32155620f490f251e4cea6), 如何把它放到本地game_dev分支上?
- merge方式
git checkout game_dev
git merge master
git push
- cherry-pick方式
git checkout game_dev
git cherry-pick 3e0b3fdf
git push
github本地创建仓库, 直接推送到远程仓库
- 登陆github, 创建一个新的仓库;
- 本地目录执行git init完成初始化;
- 远程仓库和本地仓库关联;
git remote add origin https://github.com/cuipf0823/test.git
- 合并远程分支到本地;
git merge remotes/origin/master
- 剩下就是正常提交流程;
git add . git commit -m "test" git push -u origin master
放弃本地修改,强制更新
git fetch --all
git reset --hard origin/master
git fetch只是下载远程的库的内容,不做任何的合并 git reset把HEAD指向刚刚下载的最新的版本
注: 后续用到再添加!
cuipf
