彻底学会 Git 命令的使用

一、当我们执行git add,git commit,git push發現有錯誤代碼或者多提交的文件被多提或者遗漏的补救方法步驟:

    没有执行 git add的:
        git checkout --filepathname
        git checkout .      (工作区全清)
        git reset --hard   (工作区全清)
        git stash (不想清除修改的代码,可以暂存,文章下方介绍使用)

    已经执行git add缓存了的:
        git reset HEAD filepathname (将add到缓存区的代码清除,工作区的保留)
        git reset HEAD .(缓存区全清)

    已经用 git commit 提交或已经 push了的:
        git reset --soft HEAD^(回退一次提交,不回退代码)
        git reset --hard HEAD^^(回退两次提交和代码)
        git reset --hard 版本号(回退代码到此版本号提交的代码状态)
        git reset --hard(重置了暂存区的内容,重置了本地工作区的内容,本地已经提交(不论提交成功否)的代码不回退)==  git reset --hard HEAD

二、常用命令:

    * 提交常见顺序

0. 找到待修改文件所属的.git所在目录

1. git branch -av 查看仓库下所有分支

2. git checkout (分支)切换分支,而且是切换到的分支包含你在这个分支push但尚未被merge的东西,而且还会提示你再push一次。

3. git pull 更新本仓库最新代码防止代码冲突 (如果有文件在远端分支发生的改变,而本地还是之前没改变的分支节点,那么更新结果会打印出部分文件的改变信息。但不会恢复本地暂存区、工作区、已提交区修改的东西。)(repo sync 也不能把本地已经提了的代码恢复到远端服务器最新状态)

4. 开始修改代码...

5. git diff 查看本地的修改

6. git add . (或者git add filename)添加修改到暂存区

7. git commit 编辑提交信息

8. git commit --amend 继续编辑刚才的提交信息

9. git push; 或  git push 远端服务器的名字(如origin、meizu等) HEAD:refs/for/分支名   推已经commit了的代码到远端服务器 如:git push mz HEAD:refs/for/Mars_QTF10_base、git push origin HEAD:refs/for/verify_p417_cn等等)

如果push不上去报错了, 有时候是因为和远端分支相差甚远,需要:
 1)保存好工作内容 2)git reset --hard  HEAD^ 清掉失败的提交,失败了几个就回退几下  3)git pull 然后把修改再加上去,再提交
【不回退掉失败的提交就pull,会导致后面push的时候把刚刚pull下来的n笔提交以自身为owner重复又提出n笔!】

            10. 继续修改刚才仓库的代码...

            11. git add . (或者git add filename)添加修改到暂存区

            12. git commit --amend 继续编辑刚才的提交信息

            13. git push; 或  git push 远端服务器的名字(如origin、meizu等) HEAD:refs/for/分支名;  覆盖对远端服务器刚提上去的那笔代码提交

    * 其他实用命令:

             1. git log 查看当前分支上所有人的历史提交,最上面的最新

2. git blame filename 查看某一行代码的修改历史(其显示格式为:commitid  | 代码提交作者 | 提交时间 | 代码位于文件中的行数 | 实际代码)

3. git show  +commitid 可以展示这笔提交

4. git branch –contain +commitid 可以展示包含这笔提交的分支

5. git cherry-pick <commitId>将提交合入分支中(或用gerrit页面上的cherrypick命令),之后如果需要提交可以使用git commit –amend来将git fetch下来的东西和后来又修改的东西同时提交上去。

6. git clean -df&&git reset –hard HEAD^^^&&git pull来将本地的修改、提交删除并拉取得最新代码——-即相当于在最新时间节点重新下载了此仓库 (此仓库本地提交过几次就要写几个^,不写的话就是不回退已经提交的代码(不论远端是否已经和入))

7. repo forall -c 'git clean -dfx && git reset --hard HEAD^^^' && ./repo sync -c -d -j16 --no-tags  更新整机代码

 

三、不常用命令解释:

1. 合并本地的前两次提交:

git rebase –i HEAD~2

运行完该命令,会出现如下所示内容:

    1. 将第二个pick修改为squash或者s,然后输入”:wq”退出。
    2. 这时git会自动第二个提交合并到第一个中去。并提示输入新的message(就是我们常说的comments),如下:
    1. 编辑输入新的message,然后输入”:wq”退出
    2. 此时本地的(HEAD中)最后两次提交已经被合并为一个。git log可以查看。
    3. 如果需要提交到远端,运行git push –force origin HEAD:refs/for/master即可。

 

2. git stash的使用:

当你在某分支改了东西要切到其他分支去但不想丢弃,或者想把此修改带到其他分支去,需要使用git stash

    举例第二种情况:

   

 

四、使用中的危险点:

    * A分支添加修改不提交:

          checkout到任意分支都带着这笔修改,但一旦进行过切换分支git diff就检查不到有过这笔修改,并且会在git add .时默认加上这笔修改(危险)。git clean -df(directory force)可以删除未添加到暂存区的本地修改;git reset –hard可以只删除添加到暂存区的修改,俩命令常&&一起。

    * A分支添加修改并提交:

          checkout到其他分支将不带着这笔修改,但A分支本地会保留修改不论这笔commit是否merge(说明旧仓库不适合作为新需求的提交基础或检查代码是否合入的依据,危险)。但当你切回A分支它会提示Your branch is ahead of ‘origin/s/master’ by 1 commit.   

(鉴于以上两种情况的危险性,如果不经常重新下载仓库的话,建议在修改使用git clean -df&&git reset –hard HEAD^^&&git pull来将本地的修改、提交删除并拉取最新代码),或者直接重新下载仓库)

 

五、额外经验:

1. git fetch origin 当前分支名 + git reset --hard FETCH_HEAD 可以使代码回到服务器已merge的版本(本地代码将被彻底更新)

 

2. 假如想cp一笔比较多的代码提交到一个尚未合入的分支,应该cherrypick此提交到本地然后修改冲突后git add . 然后git commit再git push

 

3. git pull --rebase和git pull都不会把刚刚在仓库提到远程的代码(未合入)消除(不会回到远程已marge的代码状态)如果本地改了代码未提,git pull --rebase会报error并且不会生效,但git pull会生效但不会清除掉本地修改的代码

 

4.通过仓库名查找对应代码路径

在.repo/manifests目录下执行grep -rn -A2 仓库名(注意大小写)   就找到path了
xjsd@xjsh01601:/media/disk1/flyme/EcarxP417/.repo/manifests$ grep -rn -A2 ecarxbus
ecarx-cn-overrides.xml:101:    name="ecarx/android/vendor/packages/ecarxbusinessservice"
ecarx-cn-overrides.xml-102-    path="android/vendor/ecarx/packages/EcarxBusinessService"
ecarx-cn-overrides.xml-103-    revision="verify_p417_cn" />

posted @ 2022-04-14 19:51  小汀  阅读(393)  评论(0编辑  收藏  举报