Skip to content

Instantly share code, notes, and snippets.

@JessonYue
Last active January 25, 2018 10:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JessonYue/1d5c8fc5e308532cbcf169629f9f6bb5 to your computer and use it in GitHub Desktop.
Save JessonYue/1d5c8fc5e308532cbcf169629f9f6bb5 to your computer and use it in GitHub Desktop.
Git命令行操作指南
git status
查询repo的状态.
git status -s: -s表示short, -s的输出标记会有两列,第一列是对staging区域而言,第二列是对working目录而言.
git log
查询分支的Commit记录
git log --oneline --graph 图形化查看全局提交记录
-----------------------------
Administrator@MicroWin10-0010 MINGW64 /e/ASproject/DBQ (master)
$ git log --oneline --graph
* 296f63f (HEAD -> master, origin/master, origin/HEAD) 增加日志上传接口
* 001e1cc 增加日志上传接口
* 8c57e1f Merge branch 'cherry-pick-7d504ea7' into 'master'
|\
| * e969148 fix:修复bug,bugly #3352,#2552
|/
* 2ea5723 feat:[东八区]同步修改过滤掉选择器关闭情况
* 65caea1 feat:[东八区]修改版本号0.2.9,准备提测。
* d61d76b feat:[东八区]提交wuyue/yanghai修改内容
* 300abd0 modify valid time
* 536470e modify no used coupons tip
* deebcd5 modify coupus view
* 4dc929e 文案修改
* e5bafa0 UI 样式调整
* 542b43a feat:[东八区]修改版本号0.2.8,准备提测。
--------------------------------------
git add 在提交之前,Git有一个暂存区(staging area),可以放入新添加的文件或者加入新的改动.
commit时提交的改动是上一次加入到staging area中的改动,而不是我们disk上的改动.
git add .
git commit
提交已经被add进来的改动.
git commit -m “the commit message"
撤销操作
git reset soft/hard/mix 一般用hard
总结:
git reset --mixed id,是将git的HEAD变了(也就是提交记录变了),但文件并没有改变,(也就是working tree并没有改变). 取消了commit和add的内容.
git reset --soft id. 实际上,是git reset –mixed id 后,又做了一次git add.即取消了commit的内容.
git reset --hard id.是将git的HEAD变了,文件也变了.
按改动范围排序如下:
soft (commit) < mixed (commit + add) < hard (commit + add + local working)
---------------------------------------------
开始回滚:
Administrator@MicroWin10-0010 MINGW64 /e/ASproject/DBQ (master)
$ git reset --hard 8c57e1f
HEAD is now at 8c57e1f Merge branch 'cherry-pick-7d504ea7' into 'master'
----------------------------------------------
关于提交的部分:
git rebase
--rebase不会产生合并的提交,它会将本地的所有提交临时保存为补丁(patch),放在”.git/rebase”目录中,然后将当前分支更新到最新的分支尖端,最后把保存的补丁应用到分支上.
rebase的过程中,也许会出现冲突,Git会停止rebase并让你解决冲突,在解决完冲突之后,用git add去更新这些内容,然后无需执行commit,只需要:
git rebase --continue就会继续打余下的补丁.
git rebase --abort将会终止rebase,当前分支将会回到rebase之前的状态.
git push
push your new branches and data to a remote repository.
git push [alias] [branch]
将会把当前分支merge到alias上的[branch]分支.如果分支已经存在,将会更新,如果不存在,将会添加这个分支.
如果有多个人向同一个remote repo push代码, Git会首先在你试图push的分支上运行git log,
检查它的历史中是否能看到server上的branch现在的tip,如果本地历史中不能看到server的tip,说明本地的代码不是最新的,Git会拒绝你的push,
让你先fetch,merge,之后再push,这样就保证了所有人的改动都会被考虑进来.
   
----------------------------------关于补丁的操作,用户本地的commit的回滚和删除------------------------------------------------
场景1: 我本地commit3次,但是需要删除中间一次提交(删除B)
A-----》B-----》C 需要删除B
git log
git format-patch -2 生成B C 的补丁文件 -N 代表生成本次之前的几次
git reset --hard A 回滚到A
git am C-.patch 打上C的补丁
场景2:指针的自由切换,可以做删除本地的多次commit,也可以恢复回来
git reset --hard A 回滚到A
git reflog 通过这个去早期的日志信息
----
$ git reflog
296f63f (HEAD -> master, origin/master, origin/HEAD) HEAD@{0}: reset: moving to 296f63f26b692b8090ac8eca4636e91de4b44210
41071bd HEAD@{1}: commit: test
6cc69b4 HEAD@{2}: commit: 增加日志上传接口
296f63f (HEAD -> master, origin/master, origin/HEAD) HEAD@{3}: reset: moving to 296f63f
4c93756 HEAD@{4}: reset: moving to 4c937567fa53c53134ac448420705db04418e1c9
296f63f (HEAD -> master, origin/master, origin/HEAD) HEAD@{5}: commit: 增加日志
上传接口
001e1cc HEAD@{6}: am: 增加日志上传接口
8c57e1f HEAD@{7}: reset: moving to 8c57e1f
8c57e1f HEAD@{8}: reset: moving to 8c57e1f
----
git reset --hard 41071bd
场景3:不需要删除本地的commit,只是需要修改其中任意一次提交的代码
方法一:用commit –amend (修改最近的一次提交)
这种方法不仅可以修改commit message,也可以修改提交内容。这种方式在还没有推送到远端的情况下可以比较方便的保持原有的Change-Id,推荐使用(若已经推送到远端,Change-Id则会修改掉)。
#修改需要修改的地方(只是修改commit message就不用做)
git add . #这一步如果只是修改commit message不用输入
git commit --amend
#输入修改后的commit message,保存
git push <remote> <branch> -f #若还没有推送到远端,不用输入
方法二:用reset后修改
这种方法与上面方法基本一致,也可以修改提交内容和commit message。这种方式在还没有推送到远端的情况下也可以比较方便的保持原有的Change-Id,(若已经推送到远端,Change-Id则会修改掉)。
git reset HEAD^
#修改需要修改的地方(只是修改commit message就不用做)
git add . #这一步如果只是修改commit message不用输入
git commit -m "new commit message" #或者git commit -c ORIG_HEAD
git push <remote> <branch> -f #若还没有推送到远端,不用输入
方法三:提交到了错误的分支上的处理
# 取消最新的提交,然后保留现场原状
git reset HEAD~ --soft
git stash
# 切换到正确的分支
git checkout name-of-the-correct-branch
git stash pop
git add . # 或添加特定文件
git commit -m "你的提交说明"
# 现在你已经提交到正确的分支上了
git checkout name-of-the-correct-branch
# 把主分支上的最新提交摘过来
git cherry-pick master
# 再删掉主分支上的最新提交
git checkout master
git reset HEAD~ --hard
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment