Git 基本操作(入职亲体验)

GitHub工具多用在多人协作开发,多团队开发的开发模式中。入职前只是稍有涉略,基本命令尚不熟练,因为没在实际过程中遇到过。尤其是一些突发状况。这边使用GIT较多,操作也较多,中间确实遇到一些问题,才正经开始认识这些常用命令。

追加一些web helper.

Git - 远程仓库的使用 (git-scm.com)

0.忽略

  不必要的改动,比如编译生成的build目录,库文件,临时可执行文件等
  git 根据提交历史里的字符串定位指定的commit
  git log -S uplus_ble_role_type_t

 
 查找本地对应的分支
git branch --contains $string

  0.1 本地忽略,就是只针对你的git生效,同步开发的其他程序员不会看到用到这个设置。

      vi  .git/info/exclude  ,

       在最下面,以行为单位,添加你需要忽略的目录、文件即可。应该支持通配符。

1. 回滚

等同于ctrl+z,当你做了半天,发现不对,想反悔的时候,或者因为一些不当操作,就用到回滚这系列操作了。就是各种取消操作。

 1.1  基本的 git reset --hard HEAD ,

  1.2 基本的 git reset --hard HEAD^  返回上一个版本

  上面两个,在所谓 push之前,都可以用来取消当前的所有修改,HEAD的意思是最近的一次commit,是的你没看错,回到最近一次的commit,可以是你pull下来的,也可以是自己提交上去的。HEAD^是最近一次的上一次操作。就是这点区别。

    但是当你push了,merge了之后,发现错了想反悔了,怎么办???

   1.3 git reset --hard $(commit_id),退回到某一次更新ID

     就是从 git log 中找到你想要返回的commit id。当你确定时,如果你想把刚刚做的,或者这个id之前的所有commit记录都取消,那么你可要慎重考虑下,因为这种操作是要强制修改服务器的,他会把这个commit之后的所有commit,都给清除掉。

    1.4 git push origin (HEAD) --force,  强制回退,刷新服务器,或者是重置服务器。HEAD可选,HEAD一般代指当前commit的分支名。不加也没事,反正我还没碰到过。这个操作会把

       好了,这就把你不想要的commit都给清掉了,或者说不想要的提交都清掉了,回到了那个指定为正确的版本。 

     但是,有时候可能commit已经找不到了,或者删了分支,或者清除了commit。这个时候怎么办?别急。除了git log,还有一个强有力的查找历史的命令

1.4  git reflog 

        怎么说呢,这个命令可以让你在一个操作记录版本库里,查找你要回退的操作。嗯,他跟commit不一样。它记载了你各种git操作,比如 checkout, revert ,push,merge,等等,实际就相当于操作日志,每个日志队对应一个编码值(HASH值,命令输出的第一列). 根据你自己的回忆,找到相应的hash值后,你就可以 --force了

回滚后依然记住要git push一下

撤销

        1. 撤销 commit、并撤销 git add. 操作、不撤销修改代码

        git reset --mixed HEAD^ 或 git reset HEAD^
        // 效果和 git reset --mixed HEAD^ 一样,--mixed 是默认参数

        2. 撤销 commit、不撤销git add .

          git reset --soft HEAD^
        3. 撤销 commit、撤销 git add . 操作、撤销修改代码
           git reset --hard HEAD^

 

2.分支

 查看分支

git brach -a   查看本地的分支

git brach -r   查看remote分支

git branch -v 查看当前所在的分支

  2.1  切换分支  git checkout -t origin/xxx  直接切换到远程的分支,本地无副本

   2.2  创建分支副本,前提是分支得在服务端存在

          git  checkout -b  new_branch_local    origin/branch_name(remote)

2.3  创建新分支,然后发布服务器。基于某个分支创建新分支,保留该分支的所有commit

         1.切换到你想要复制的分支

         2.git pull,拉过来最新代码

         3.git  checkout -b  new_branch_local2.

         4.git log 对照看下是否正确

         5.git push origin new_branch_local2  推到远程

         6. 重点: git branch --set-upstream-to=origin/new_branch_local2  据说是保持远程服务器自动同步的操作?

         7.开始自己的改动操作。

2.3   合并指定目录的代码。不影响其他目录的改动。

         有时候,一个功能模块可能存在于多个工程下,但是多个工程下除了相同模块,其他功能模块可能有很大区别。

        某次,相同模块在别的地方被改了,需要更新进化。那么这时候,我们肯定不想用合并,因为可能在非相同目录上产生巨量的不必要的工作量。

        git有这种便利操作吗。肯定有的,那就是 cherry-pick挑拣分支。

       比如,另一个工程在另一个仓库里,前提是只涉及到相同模块的一次commit,那么我们就可以用命令把这次commit挑拣过来,作为一次补丁,放心的打在我们的相同模块上,当然,可能会导致一点点冲突,解决后在用命令提交即可。

        2.3.1      git checkout res_tobe_fond

        2.3.2      git log // find the corresponding  commit  included the modifation u want,make it sure .

        2.3.3      git checkout res_tobe_update.

        2.3.4      git cherry-up  commit_specificed

        2.3.5      这时候可能会有冲突,如果没有直接  git push,到这里就结束了。否则看下面

        2.3.6       如果有,git status  ; git diff 后会在代码里生成改动提示。VS里应该是个插件,改动的是两个版本的各自内容,你可以在最上面选择,那一行小字。

        2.3.7       git add  改动后的修改

         2.3.8       git cherry-pick --continue

          2.3.9       git push...

   2.4  if u just want pick some of the change from a commit , u can do...

         git cherry-pick -n  $commitID

        如果commit里面有多个文件,执行此命令后需要先unstage 并恢复不想要改动的文件

          git reset HEAD <file_name>

           git checkout -- <file_name>

         可能还能用到  git clean -f $filename

        然后不同的是,git commit  , git push

2.5  git从某一个commit新建分支进行开发
        首先调用 git log 来查看历史commit信息
        然后使用命令 git checkout [commitid] -b [new-branch-name] 来根据某个commit创建新分支

        或者 

        # 查看所有提交记录

        $ git log --oneline

        # 复制想要创建分支的提交的SHA值

        # 创建新分支

        $ git checkout -b <new_branch_name> <commit_sha>

        # 切换到新创建的分支

        $ git checkout <new_branch_name>

        最后推送到仓库中使用命令 git push origin [new-branch-name] 就会在仓库中生成一个新的         branch 用于接下来的开发
       git branch --set-upstream-to=origin/new_branch_local2

 3.多行提交

     while u're going to make a new commit message , generally u would use "git commit -m "blablabla".  You may find it not supportting multi-line input, then, how to input multi-line commit messeges , that's what we talk about on this tips.

     多行提交有很多方式,

 3.0  在你提交阶段 commi -m阶段,如果想实现分行多行

        git co -m "commit title" -m "commit description"

      或者 用这个shell本身支持的命令分行

     git -m "commit title  回车

  >  继续编辑 commit context

  > commit end "  回车

  3.1 在你刚刚add了一些文件后,发现少写了一些说明

       git commit --amendgit 

       这回调出一个文本编辑界面,最上面是刚才编辑的提交说明,你可以接着写,然后提交

       然后push

   3.2 如果已经push了的话,也可以用3.1里的命令。如果已经涉及到了新的改动,想强制合并,

那么可以先add. 然后再调用上面的命令,在追加信息。

       然后是强制上推的命令

git push origin (HEAD) --force (慎用吧,我是自己的临时分支,所以敢乱来)

4.git rebase -i  合并一些commit,然后成一个commit.有偷天换日之能.

5.删除(不用怕之前cherry-up过来的会被delete掉,那是新的commit了已经)

已有的本地分支要删除,搞起...

5.1切换到不被删除的分支

5.2 git branch -d [branch_name]. 先删除本地分支

5.3 git push origin --delete [branch_name].再删除远程分支

 6.子模块

 git submodule status  查看罗列子模块

git submodule update --init   --recursive更新子模块

  7. git stash

(1)git stash save "save message"  : 执行存储时,添加备注,方便查找,只有git stash 也要可以的,但查找时不方便识别。

(2)git stash list  :查看stash了哪些存储

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

(4)git stash show -p : 显示第一个存储的改动,如果想显示其他存存储,命令:git stash show  stash@{$num}  -p ,比如第二个:git stash show  stash@{1}  -p

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

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

(7)git stash drop stash@{$num} :丢弃stash@{$num}存储,从列表中删除这个存储

(8)git stash clear :删除所有缓存的stash

7. patch 补丁

7.1. diff 和 patch 的区别
Git 提供了两种补丁方案,一种是通过 git diff 生成的 .diff 文件,第二种是通过 git format-patch 生成的 .patch 文件。

通过 git diff 生成的文件不含有 commit 信息,可以指定文件生成 diff,也可以指定单个 commit, 多个 commit 生成 。通过 git format-patch 生成的 .patch 文件 含有 commmit 信息。一个 commit 对应一个 patch 文件。

在实际开发中,我们会经常用到补丁,不论是在代码迁移,还是bug修复中,都时常使用
 

7.2. 生成patch
 git diff
指定文件生成 patch 文件

patch 补丁即为根据 git diff 生成的文本内容文件,最简单的生成方法为 git diff > test.patch。

举例子:比如我们修改了 A.java、B.java 文件,我们只想将 A.java 文件的修改打成 patch,那么我们可以使用以下的命令:
  git diff A.java > test.patch

想把所有的修改文件打成 patch,即 A.java、B.java 文件,只需要使用下面的命令:
  git diff > test.patch

指定 commit id 生成 patch

使用命令行
  git diff 【commit sha1 id】 【commit sha1 id】 > 【diff文件名】

7.3 应用

先检查patch文件:
  git apply --stat xxx.patch

检查能否应用成功
  git apply --check xxx.patch

打补丁:
  git apply xxx.patch

其他技巧

1. 在Readme.md中加入图示.

将图片放在仓库里面,在文件里链接它,最后 push 到 github 上。 

github 图片链接格式:
![](img_url)

即 叹号! + 方括号[ ] + 括号( ) 其中叹号里是图片的URL。

(http://github.com/yourname/your-repository/raw/master/images-folder/xxx.png) 


然后在 README.md 里添加:

例如:我在我的 gitbug项目中有个图片

![image](https://github.com/panacena/mengqu/blob/master/readme/Screenshot_2016-07-10-22-17- 15_zkk.com.mengqu.png) 

git ammend

对于已有一个提交记录push到远程, 但你本地目前有一点小的修改,想再推送到远程,但不想再生成一个提交记录,使得commit记录过多,且不想更改已有的commit message。

解决方案 :
1.git add . 将要更改的代码提交。
2. 这时候 可以使用 git amend进行合并代码

最后强推到远程

git push -f

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值