git 常用使用

1. git 代码管理的流转图如下:

Workspace:工作区
Index / Stage:暂存区
Repository:仓库区(或本地仓库)
Remote:远程仓库

git 常用使用_第1张图片

2. 配置git 的邮箱和用户名 

      git config --global user.name "Your Name"             
      git config --global user.email "[email protected]"
      git config --global  --list 查看邮箱配置

3. 初始化仓库,把目录变成git 可以管理的仓库

    git init

4.分支操作

创建本地分支

//新创建的分支名字experimental
git branch experimental

查看本地分支列表


git branch
//加上 -r 参数 显示远端分支。
//加上 -a 参数,同时显示远端和本地分支。
//运行结果如下
experimental
* master
//“experimental” 分支是你刚才创建的,“master”分支是Git系统默认创建的主分支。星号(“*”)标识了你当工作在哪个分支下

切换分支:

//切换到”experimental”分支
git checkout experimental

同時建立分支和切換

//在 checkout 命令给定 -b 参数执行,可以同時建立分支和切換。

git checkout -b 

删除分支

//删除掉你的 “experimental” 分支
git branch -d experimental

⑥合并分支

   

git merge 


 

5. 添加 文件到暂存区


    

    git  add . 添加当前文件夹下的所有文件
    git add 文件夹加 后缀名
    git add common/ main/

6. 将本地暂存的修改提交到本地仓库

   //我们用的比较多的应该就是-m 参数。添加提交信息。 双引号中是提交内容的注释
    git commit -m "fix titlebar show or hide"  


   //会用一个新的 commit 更新并替换最近的 commit ,这个新的 commit 会把任何修改内容和上一个         // commit 的内容结合起来。如果当前没有提出任何修改,这个操作就
   //只会把上次的 commit 消息重写一 遍。

    git commit --amend   

 git commit --amend   这个命令就比较优秀了。经过个人的探索,我总结了它的两个功能

    可以修改上一次的提交信息。
    可以将最近的修改追加到上一次的提交上

    执行上面的命令,进入到vim 编辑器 , 你会发现编辑器里你怎么输入都没反应,这是因为vim           处在不可编辑状态.

          windows操作: 按下字母键 c(此时进入编辑状态),可以开始修改注释信息了,修改好                           后,你会发现怎么都退出不了,然后如下操作:按下Esc (退出编辑状态), 接着shif                           +: 然后输入wq (保存编辑),再按回车,退出vim!
          LINUX操作:进入之后直接可以进行编辑,编辑完成ctrl +x ,提示按y .直接保存退出vim.

                 

7. 通过命令git status查看当前git 提交状态

git status


8. 通过git diff 加上文件路径查看文件到底更改了什么内容

  

git diff readme.txt   

//使用 git diff 命令再加上 --cached 参数 ,看看哪些文件将被提交(commit)。

 git diff --cached

9.git log 可以让我们查看提交commit history 从而 可以获取到commit id 这个值可以在版本回退时使用

  

git log

commit 44bcf89262a5e85611d487093011d663b15fecf9 (HEAD -> xxxx, origin/xxxx)
Author: xxx 
Date:   Mon Mar 23 15:24:43 2020 +0800

    update version 1.0.82

    Change-Id: I8e83b43b41b7ec99528b74b7b31f67ed2060aa33


10.git log --pretty=oneline 如果感觉log显示太繁琐,可以加上参数  --pretty=oneline,只会显示版本号和提交时的备注信息

$ git log --pretty=oneline
44bcf89262a5e85611d487093011d663b15fecf9 (HEAD -> xxxx, origin/xxx) update version 1.0.82
a6c1d3c2bb4f21130450bba361e322213a155a6a bug  animation
e94e76f26dd09725b08d81e7e553049756e7afe9 Add Swiping dead zone  bottom of camera app

11.git reflog  可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)

      例如执行 git reset --hard HEAD~1,退回到上一个版本,用git log则是看不出来被删除的commitid,用git reflog则可以看到被 删除的commitid,我们就可以买后悔药,恢复到被删除的那个版本。


$ git log --pretty=oneline
44bcf89262a5e85611d487093011d663b15fecf9 (HEAD -> xxxx, origin/xxxx) update version 1.0.82
a6c1d3c2bb4f21130450bba361e322213a155a6a bug animation
e94e76f26dd09725b08d81e7e553049756e7afe9 Add Swiping dead zone  bottom of camera app
5f069149a4e80c2ed4050229f2fc2aca90e57f12 Back button in Settings needs to have a touch-down plate


$ git reflog
44bcf89 (HEAD -> xxxx, origin/xxxx) HEAD@{0}: reset: moving to 44bcf89262a5e85611d487093011d663b15fecf9
30580aa HEAD@{1}: cherry-pick: Talk back does will announce when zoomed

12.版本回退    重置“本地仓库”修改

  •    git reset

场景: 你在本地commit 了一些东西(还没有 push),但是所有这些东西都很糟糕,你希望撤销                     前面的三次提交 ,就像它们从来没有发生过一样。   

git 常用使用_第2张图片

//回退到上一个版本;
git reset --hard HEAD~1  

//回退到某一个版本号,last_commit_id就是commit id也就是可以从git log 拿到
git reset --hard last_commit_id    
  • git revert

        

       你已经执行了 git push, 把你的修改发送到了远程仓库,现在你意识到这些 commit 的其中一个是有问题的,你需要撤销那一 个 commit。(最重要的一点:revert 是回滚某个 commit ,不是回滚“到”某个commit 也就是说 回滚的目标版本之后的提交是不会受到影响的 )

  git 常用使用_第3张图片

       

  上图来自网络

//使用“git revert -n 版本号”反做,并使用“git commit -m 版本名”提交:
//(1)反做,使用“git revert -n 版本号”命令。如下命令,我们反做版本号为8b89621的版本:

 git revert -n 8b89621019c9adc6fc4d242cd41daeb13aeb98611
// 注意: 这里可能会出现冲突,那么需要手动修改冲突的文件。而且要git add 文件名。
//(2)提交,使用“git commit -m 版本名”,如:

 git commit -m "revert add text.txt" 

13.git stash 命令的用法:

简介

默认情况下, git stash 命令会把以下修改存储到一个新的堆栈中。堆栈中的内容(stash)可以被所有分支访问。

  • 暂存区中的修改
  • 工作区中已经存在的文件的修改

也就是说,默认情况下,git stash 命令不会存储下列文件。

  • 工作区中新增的文件(untracked files)
  • 被版本库忽略的文件(.gitignore 中定义的)

如果你还想要存储 untracked files,可以使用 -u 选项。

git stash -u

如果你想要在 git stash 时,添加一个 message 注解,可以使用 save 选项。

git stash save "备注信息"

执行 git stash 命令后,工作区就恢复到了上一次 git commit 时的状态。具体表现为:

  • 暂存区中的修改看不见了。
  • 工作区中已经存在的文件的修改也看不见了。
  • 如果使用了 -u 选项,工作区中新添加的文件对于工作区也看不见了。

这样工作区就干净多了。使用 git diff 和 git diff --cached 也看不到工作区和暂存区中的修改了。因为它们都被存储到了一个堆栈中。

然后,我们就可以新建分支,切换到新的分支来处理其他的需求.

git stash 的常用命令

存储到堆栈

git stash save -u "备注信息"

查看堆栈中的 stash 列表

# 堆栈中可能会有多个 stash,通过 stash_id 进行区分
git stash list

查看 stash 的内容

git stash show
 
git stash show stash@{id}
 
git stash show -p

将堆栈中的 stash 应用到工作区

# 将堆栈中的指定 stash 应用到工作区(保留堆栈的内容)
git stash apply stash@{id} 
# 将堆栈中的最近一次 stash,应用到工作区(保留堆栈的内容)
git stash apply
# 等价于上面的一条命令
git stash apply stash@{0}

既然是堆栈,那么就遵循『先进后出』。也就是说,如果 git stash 了多次,最近一次存储会位于堆栈的顶部(stash_id 为 0),它会被优先读取。

如果你想在成功应用了堆栈的 stash 后,立即将其从堆栈中删除。可以使用 git stash pop 命令。

# 将堆栈中的最近一次 stash,应用到工作区(删除堆栈的内容)
git stash pop

删除堆栈中的 stash

# 删除指定的 stash
git stash drop stash@{id} 
 
# 删除最近一次的 stash
git stash drop
 
# 删除所有的 stash
git stash clear

 git stash  应用场景举例:

比如,你在本地版本库的 dev 分支,开发某个需求,但是你只完成了一半,你又不想把它 git commit 提交到版本库,也就是说工作区或者暂存区中有一些你并不想提交到版本库的代码。这时,你又接到了另外一个需求,急需进行开发。你就可以使用 git stash 来解决这个问题。

首先,将工作区和暂存区中的修改,存储到堆栈。

git stash save -u "需求 a 只完成了一半"

这样,工作区和暂存区就都干净了。可以使用下面的命令进行检测。

D:\phpStudy\WWW\private-demo (dev)
$git diff
 
D:\phpStudy\WWW\private-demo (dev)
$git diff --cached

查看堆栈中的 stash 列表。(由于我们只 git stash 存储了一次,故堆栈中只有一个 stash)

λ git stash list
stash@{0}: On dev: 需求 a 只完成了一半

查看 stash 的内容。

D:\phpStudy\WWW\private-demo (dev)
git stash show
 a.php  | 2 ++
 b.php | 3 ++-
 2 files changed, 4 insertions(+), 1 deletion(-)

然后,就可以在当前的 dev 分支中,优先完成需求 b。

如果需求 b 已开发完成,就将其提交到版本库。

D:\phpStudy\WWW\private-demo (dev)
git add .
 
git commit -m "需求 b 已完成"

如果需求 b 需要优先上线,就推送到远程仓库。

# 保持 dev 分支有 master 分支的最新代码
git pull origin master
# 推送到远程的 dev 分支
git push origin dev

最后,我们将堆栈中的 stash 弹出,应用到当前的工作区。

git stash pop

继续完成需求 a 中未完成的工作。

如果需求 a 也完成了,也将其提交到版本库。

总结: 实际开发过程中,经常会遇到多个需求交叉开发的情况。可以用 git stash 堆栈来解决这个问题。当然,如果你对 git stash 掌握不好,也可以创建多个分支来解决。

14.checkout使用删除缓冲区中的数据

①git checkout -- readme.txt 意思就是把readne.txt文件在工作区域的修改全部撤销,把readme.txt从HEDA中迁出。

② git checkout. 这条命令把当前目录所有修改的文件从HEAD中签出并且把它恢复成未修改时的样子。注意使用git checkout.  时如果对应的文件被修改过。那么该修改会被覆盖掉。

③ git reset HEAD --  删除暂缓区中 的文件;

15.git push 的使用

作用:用于将本地分支的更新推送到远程主机

语法:git push <远程主机名> <本地分支名>:<远程分支名>

例子:

git push origin master:master

//注意:这里的:前后是必须没有空格的,git pull是<远程分支>:<本地分支>, git push是<本地分支>:<远程//分支>

git push origin master
//上述命令省略了远程分支名,表示将本地分支推送与之存在"追踪关系"的远程分支(通常两者同名),如果该远//程分支不存在,则会被新建。

git push origin :refs/for/master
//上述命令省略了本地分支名,表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支,相当

//于执行git push origin --delete master命令,表示删除origin主机的master分支。


git push origin
//上述命令表示,将当前分支推送到origin主机的对应分支。如果当前分支与远程分支之间存在追踪关系,则本
//地分支名和远程分支名都可以省略。

git push

//如果当前分支只有一个远程分支,那么主机名都可以省略,可以使用git branch -r查看远程的分支名。

git push -u origin master
//如果当前分支与多个主机存在追踪关系,则可以使用-u参数指定一个默认主机,以后就可以直接使用git push
//命令了。


    

平时开发中常用的提交命令
git push origin HEAD:refs/for/master

字段说明:

git push 肯定是推送。

origin : 是远程的库的名字。
HEAD: 是一个特别的指针,它是一个指向你正在工作的本地分支的指针,可以把它当做本地分支的别名。git这样就可以知道你工作在哪个分支
refs/for :意义在于我们提交代码到服务器之后是需要经过code review 之后才能进行merge的
refs/heads 不需要

16. 生成SSH key 生成秘钥

执行如下命令:
$ ssh-keygen
接着会提示以下内容,在必要的地方输入想要設定的验证密码,並按 『Enter 』键确认。

如果沒有要设定验证密码,請不要輸入任何文字,直接輸入『 Enter』 鍵即可。

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/eguchi/.ssh/id_rsa): <輸入 Enter 鍵>
Created directory '/Users/eguchi/.ssh'.
Enter passphrase (empty for no passphrase): <輸入驗證密碼>
Enter same passphrase again: <再輸入一次同樣的驗證密碼>
Your identification has been saved in /Users/eguchi/.ssh/id_rsa.
Your public key has been saved in /Users/eguchi/.ssh/id_rsa.pub.
The key fingerprint is:
57:15:3c:ca:f2:dc:27:6d:c2:9a:88:d0:70:cf:8d:31 [email protected]
The key's randomart image is:
+--[ RSA 2048]----+
|             .o. |
|             .o  |
|           ... . |
|      . . E.o    |
|       +So.O o . |
|      . ..+ + = +|
|       . . . o = |
|        . . o    |
|                 |
+-----------------+
执行下列命令就会生成SSH公开密钥。

$ cat ~/.ssh/id_rsa.pub
输出示例如下

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDkkJvxyDVh9a+zH1f7ZQq/JEI79dVjDSG
4RzttQwfK+sgWEr0aAgfnxdxQeDKxIxqI1SwyTY8oCcWzvpORuPqwbc7UWWPcCvbQ3jlEdN
5jvwKM82hincEWwI3wzcnVg2Mn8dH86b5m6REDzwRgozQ3lqrgwGVlTvkHDFs6H0b/1PSrM
XGppOP/QXGEVhZ6Hy4m3b1wMjjrbYwmWIeYklgoGHyrldhAaDYc33y7aUcRyFyq5DubtsLn
2oj4K+1q36iviCHxCOri0FDmn2dzylRCI4S+A2/P7Y7rVfdT+8OWYKCBUs8lfjujghEtejq
Qmj9ikyGTEAW1zQCN7hVwYdjL.....

17. git  cherry- pick  合并某个commit

         使用方法及其作用:

    cherry-pick 命令可以从其他的分支复制指定的提交,然后进入到现在在的分支。

git 常用使用_第4张图片

git cherry-pick  commitid

cherry-pick 过程中也是可能会产生冲突的,解决冲突后先 add,然后使用 git cherry-pick--continue。如果想放弃 cherry-pick,使用 git cherry-pick --abort

 18.git clone

克隆项目可以直接使用 克隆地址加上 -b 加上分支;

git clone 克隆地址  -b  分支名

19.git show 可以用于显示各种类型对象的相关信息 显示类中的变化信息

git show 253754448cff22e94ce4989a7fc816a9ee0b5339     show 后面是commit id

20.git fetch, git pull,git pull --rebase 拉取远程分支代码更新本地分支

①git fetch 和 git pull 的区别

在执行 git pull 后,代码会自动 merge 到本地的分支中,而 git fetch 会忽略掉这个 merge 操作,因此简单来说:

git pull = git fetch + git merge

②git pull 和 git pull --rebase 区别

git pull 命令默认包含了一个 --merge 参数,因此二者的区别其实就是 merge 和 rebase 的区别。

merge

merge 会创建一个新的 commit,如果合并时遇到了冲突,需要解决冲突后重新 commit。 git 常用使用_第5张图片

rebase

git 常用使用_第6张图片 rebase 会将两个分支进行合并,同时合并之前的 commit 历史。如果出现冲突,解决冲突后执行以下命令即可:

git add
git rebase --continue

21.生成和合入patch的两种方式

Git 提供了两种补丁方案,一是用git diff生成的UNIX标准补丁.diff文件,二是git format-patch生成的Git专用.patch 文件。 .diff文件只是记录文件改变的内容,不带有commit记录信息,多个commit可以合并成一个diff文件。 .patch文件带有记录文件改变的内容,也带有commit记录信息,每个commit对应一个patch文件。

1. 生成patch文件常用命令

1.1 找到commit id

在生成补丁文件前,一般要通过git log命令找到commit id,如果下图所示:

git 常用使用_第7张图片

1.2 创建.patch 文件(git format-patch) 的常用命令行

    1.2.1某次提交(含)之前的几次提交,n指从sha1 id对应的commit开始算起之前n个提交。

               格式:git format-patch 【commit sha1 id】-n  


            git format-patch  c3e543fd0c64b46406078a6d1ed63948ba50a62e -2

   1.2.2某一笔提交的patch

              格式:git format-patch 【commit sha1 id】 -1

            git format-patch  c3e543fd0c64b46406078a6d1ed63948ba50a62e -1

1.2.3某两次提交之间的所有patch

            格式:git format-patch 【commit sha1 id】..【commit sha1 id】 

     git format-patch  2a2fb4539925bfa4a141fe492d9828d030f7c8a8..89aebfcc73bdac8054be1a242598610d8ed5f3c8

  

1.3生成diff文件常用命令

1.3.1某两笔(包前包后)提交之间的所有提交

   格式:git diff commitID1 commitID2 > patch.diff

git diff c3e543fd0c64b46406078a6d1ed63948ba50a62e fe1b5f9f5b8f750595861cd46a586a7afd9cab04 > test.diff

 

1.3.2将单个文件做成一个单独的补丁

格式:git diff testFile > patch

1.3.3将工作区与版本库的差异做成补丁

格式:git diff --HEAD > patch

1.3.4将暂存区与版本库的差异做成补丁

格式:​​​​​​git diff --cached > patch

2 合入patch和diff文件的常用命令

2.1检查patch/diff是否能正常打入
 

git apply --check file.patch文件
//或:
git apply --check file.diff文件


2.2打入patch/diff
 

git apply file.patch文件
//或:
git apply file.diff文件

3 解决冲突

合入patch 时出现了报错解决如下:git apply --reject file.patch这个命令会自动合入不冲突的代码,然后保留冲突的部分,同时会生成后缀为.rej的文件,用于保存没有合并进去的部分,可以参考这个进行冲突解决。解决完冲突后,删除后缀为.rej文件,并执行git add . 添加改动到暂存区最后执行git am --resolved或者git am --continue

备注:在打入patch冲突时,可以执行git am --skip跳过此次冲突,也可以执行git am --abort回退打入patch的动作,还原到操作前状态。
 

你可能感兴趣的:(代码管理Git,git)