git 的常用命令

git 的常用命令

    • 1 使用秘钥
      • 1.1 ssh-keygen生成秘钥
      • 1.2 ssh-copy-id复制到远程
      • 1.3 常见问题
    • 2 git常用命令(操作)
      • 2.1git 克隆仓库
      • 2.2 git 拉取
      • 2.3 git 获取
      • 2.4 git 分支
      • 2.5 git 切换
      • 2.6 git 合并
      • 2.7 git 更新远程分支列表
      • 2.8 git 提交到本地仓库
      • 2.9 git revert 用法
      • 2.10 git 比较本地仓库和远程仓库的差异
    • 3 脚本

参考文章:
https://git-scm.com/book/zh/v2
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

1 使用秘钥

1.1 ssh-keygen生成秘钥

使用ssh-keygen生成私钥和公钥,命令:ssh-keygen -t rsa
例子:

fdipzone@ubuntu:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/fdipzone/.ssh/id_rsa): 这里输入要生成的文件名
Enter passphrase (empty for no passphrase):                       这里输入密码 
Enter same passphrase again:                                      这里重复输入密码
Your identification has been saved in /home/fdipzone/.ssh/id_rsa.
Your public key has been saved in /home/fdipzone/.ssh/id_rsa.pub.
The key fingerprint is:
f2:76:c3:6b:26:10:14:fc:43:e0:0c:4d:51:c9:a2:b0 fdipzone@ubuntu
The key's randomart image is:
+--[ RSA 2048]----+
|    .+=*..       |
|  .  += +        |
|   o oo+         |
|  E . . o        |
|      ..S.       |
|      .o .       |
|       .o +      |
|       ...oo     |
|         +.      |
+-----------------+

# 参数 -t rsa 表示使用rsa算法进行加密,执行后,会在/home/当前用户/.ssh目录下找到id_rsa(私钥)和id_rsa.pub(公钥)

fdipzone@ubuntu:~$ ls -lt ~/.ssh
总用量 12
-rw------- 1 fdipzone fdipzone 1679 2015-08-07 00:28 id_rsa
-rw-r--r-- 1 fdipzone fdipzone  397 2015-08-07 00:28 id_rsa.pub

也可以使用 dsa 加密算法进行加密,命令如下:
ssh-keygen -t dsa

# 设定客户端连接使用的ssh私钥和公钥
vim /etc/ssh/ssh_config
#   IdentityFile ~/.ssh/identity
#   IdentityFile ~/.ssh/id_rsa
#   IdentityFile ~/.ssh/id_dsa
把前面#去掉,然后在 IdentityFile 后填写你用来执行ssh时所用的密钥

1.2 ssh-copy-id复制到远程

ssh-keygen 产生公钥与私钥对,而ssh-copy-id 将本机的公钥复制到远程机器的authorized_keys文件中,ssh-copy-id也能让你得到访问远程机器的home, ~./ssh , 和 ~/.ssh/authorized_keys的权利

  1. 在本地机器上使用ssh-keygen产生公钥私钥对
    $ ssh-keygen
  2. 用ssh-copy-id将公钥复制到远程机器中
    $ ssh-copy-id -i .ssh/id_rsa.pub 用户名字@192.168.x.xxx
    注意: ssh-copy-id 将key写到远程机器的 ~/ .ssh/authorized_key.文件中
  3. 登录到远程机器不用输入密码
$  ssh 用户名字@192.168.x.xxx
Last login: Sun Nov 16 17:22:33 2008 from 192.168.1.2

1.3 常见问题

ssh-copy-id -u eucalyptus -i ~eucalyptus/.ssh/id_rsa.pub ssh 用户名字@192.168.x.xxx
第一次需要密码登录
上述是给eucalyptus用户赋予无密码登陆的权利

/usr/bin/ssh-copy-id: ERROR: No identities found
使用选项 -i ,当没有值传递的时候或者 如果 ~/.ssh/identity.pub 文件不可访问(不存在), ssh-copy-id 将显示上述的错误信息 ( -i选项会优先使用将ssh-add -L的内容)

2 git常用命令(操作)

2.1git 克隆仓库

  1. git clone 不指定分支
git clone  http://10.1.1.11/service/tmall-service.git
  1. git clone 指定分支
git clone -b dev_jk http://10.1.1.11/service/tmall-service.git

命令中:多了一个 -b dev-jk,这个dev_jk就是分支,http://10.1.1.11/service/tmall-service.git为源码的仓库地址

2.2 git 拉取

1、将远程指定分支 拉取到 本地指定分支上:

git pull origin <远程分支名>:<本地分支名>

2、将远程指定分支 拉取到 本地当前分支上:

git pull origin <远程分支名>

3、将与本地当前分支同名的远程分支 拉取到 本地当前分支上(需先关联远程分支)

git pull origin

实例

eports@dev:/opt/shellScript/ad-ws-port$ git pull
remote: Counting objects: 42, done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 42 (delta 15), reused 0 (delta 0)
Unpacking objects: 100% (42/42), done.
From repo.e-ports.com:e-ports/ad-ws-port
   d5032a2..03b52ed  test       -> origin/test
   0b051db..2784d9e  develop    -> origin/develop
Updating d5032a2..03b52ed
Fast-forward
 .../src/main/java/com/eports/ad/ws/port/controller/PortController.java | 12 ++++++++++++
 ad-ws-port-api/src/main/resources/mapper/PortMapper.xml                |  4 ++--
 .../src/main/java/com/eports/ad/ws/port/vo/EPPortByIdVO.java           | 33 +++++++++++++++++++++++++++++++++
 .../src/main/java/com/eports/ad/ws/port/vo/EPPortOfChinaVO.java        |  2 ++
 4 files changed, 49 insertions(+), 2 deletions(-)
 create mode 100644 ad-ws-port-client/src/main/java/com/eports/ad/ws/port/vo/EPPortByIdVO.java
eports@dev:/opt/shellScript/ad-ws-port$ git fetch
eports@dev:/opt/shellScript/ad-ws-port$ git pull origin develop
From repo.e-ports.com:e-ports/ad-ws-port
 * branch            develop    -> FETCH_HEAD
Already up to date.
eports@dev:/opt/shellScript/ad-ws-port$ git pull origin develop:develop
From repo.e-ports.com:e-ports/ad-ws-port
   0b051db..2784d9e  develop    -> develop
Already up to date.
eports@dev:/opt/shellScript/ad-ws-port$

在克隆远程项目的时候,本地分支会自动与远程仓库建立追踪关系,可以使用默认的origin来替代远程仓库名,
所以,我常用的命令就是 git pull origin <远程仓库名>,操作简单,安全可控。
git pull --rebase = git fetch + git rebase
git rebase用于把一个分支的修改合并到当前分支

2.3 git 获取

git fetch origin
只是手动指定了要fetch的remote。

git fetch origin branch1
设定当前分支的 FETCH_HEAD’ 为远程服务器的branch1分支`.
注意: 在这种情况下, 不会在本地创建本地远程分支, 这是因为:
这个操作是git pull origin branch1的第一步, 而对应的pull操作,并不会在本地创建新的branch.
一个附加效果是:
这个命令可以用来测试远程主机的远程分支branch1是否存在, 如果存在, 返回0, 如果不存在, 返回128, 抛出一个异常.

git fetch origin branch1:branch2
只要明白了上面的含义, 这个就很简单了,
首先执行上面的fetch操作
使用远程branch1分支在本地创建branch2(但不会切换到该分支),
如果本地不存在branch2分支, 则会自动创建一个新的branch2分支,
如果本地存在branch2分支, 并且是fast forward', 则自动合并两个分支, 否则, 会阻止以上操作.git fetch origin :branch2等价于:git fetch origin master:branch2`

eports@dev:/opt/shellScript/ad-ws-port$ git fetch
eports@dev:/opt/shellScript/ad-ws-port$ git fetch origin develop
From repo.e-ports.com:e-ports/ad-ws-port
 * branch            develop    -> FETCH_HEAD
eports@dev:/opt/shellScript/ad-ws-port$ git fetch origin develop:develop
eports@dev:/opt/shellScript/ad-ws-port$

注意:git pull = git fetch + merge

2.4 git 分支

xu_bob@DESKTOP-NVM39PS MINGW64 /d/E-Ports/ad-ms/ad-ms (test)
$ git branch  # 查看本地分支,带'*'的是当前本地分支。
* test

xu_bob@DESKTOP-NVM39PS MINGW64 /d/E-Ports/ad-ms/ad-ms (test)
$ git branch -r    # 查看远程分支
  origin/HEAD -> origin/master
  origin/develop
  origin/master
  origin/test

xu_bob@DESKTOP-NVM39PS MINGW64 /d/E-Ports/ad-ms/ad-ms (test)
$ git branch -a    # 查看所有分支
* test
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/master
  remotes/origin/test

xu_bob@DESKTOP-NVM39PS MINGW64 /d/E-Ports/ad-ms/ad-ms (test)
$ git checkout -b develop origin/develop    # 创建新分支,并指定远程分支
Switched to a new branch 'develop'
Branch 'develop' set up to track remote branch 'develop' from 'origin'.

eports@dev:/opt/shellScript/ad-ws-port$ git branch t2   # 创建本地分支,但不会切换分支
eports@dev:/opt/shellScript/ad-ws-port$ git branch
  develop
  t2
* test

eports@dev:/opt$ git branch -d t2  # 删除t2分支,如果在分支中有一些未merge的提交,那么会删除分支失败
error: The branch 't2' is not fully merged.
If you are sure you want to delete it, run 'git branch -D t2'.

eports@dev:/opt/shellScript/ad-ws-port$ git branch -D t2   # 强制删除t2分支
Deleted branch t2 (was 03b52ed).
eports@dev:/opt/shellScript/ad-ws-port$ git branch
  develop
* master
  t3
  test

2.5 git 切换

xu_bob@DESKTOP-NVM39PS MINGW64 /d/E-Ports/ad-ms/ad-ms (develop)
$ git checkout test    # 切换本地分支到 test
Switched to branch 'test'
Your branch is up to date with 'origin/test'.
eports@dev:/opt/shellScript/ad-ws-port$ git checkout -b t3   # 创建分支,且会切换到新建分支
Switched to a new branch 't3'
eports@dev:/opt/shellScript/ad-ws-port$ git branch
  develop
  t2
* t3
  test
eports@dev:/opt$ git checkout -b master origin/master # 从远程仓库里拉取一条本地不存在的分支,且会切换到新建分支
Branch 'master' set up to track remote branch 'master' from 'origin'.
Switched to a new branch 'master'
eports@dev:/opt/shellScript/ad-ws-port$ git branch -a
  develop
* master
  t2
  t3
  test
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/master
  remotes/origin/prod
  remotes/origin/test

2.6 git 合并

xu_bob@DESKTOP-NVM39PS MINGW64 /d/E-Ports/ad-ms/ad-ms (test)
$ git pull     
remote: Counting objects: 73, done.
remote: Compressing objects: 100% (61/61), done.
remote: Total 73 (delta 35), reused 1 (delta 1)
Unpacking objects: 100% (73/73), done.
From repo.e-ports.com:e-ports/ad-ms
   243ce7a..ac6d997  develop    -> origin/develop
Already up to date.

xu_bob@DESKTOP-NVM39PS MINGW64 /d/E-Ports/ad-ms/ad-ms (test)
$ git merge develop    # 合并 'develop分支' 到 'test分支'
Merge made by the 'recursive' strategy.
 pom.xml                                            |  17 ++
 .../com/eports/ad/ms/config/RedisCacheConfig.java  |   2 +-
 .../com/eports/ad/ms/constants/CommonContants.java |   5 +
 .../eports/ad/ms/controller/LineUpController.java  |  44 ++-
 .../com/eports/ad/ms/entity/lineUp/LineUp.java     |   4 +
 .../eports/ad/ms/entity/vo/TerminalBasicVO.java    |  17 ++
 .../ad/ms/entity/vo/TerminalWithLineUpVO.java      |  17 ++
 .../ad/ms/exception/GlobalExceptionHandler.java    |  99 +++++++
 .../com/eports/ad/ms/exception/MyException.java    |  51 ++++
 src/main/java/com/eports/ad/ms/log/Log.java        | 264 ++++++++++++++++++
 src/main/java/com/eports/ad/ms/log/SysLog.java     |  14 +
 .../java/com/eports/ad/ms/log/WebLogAspect.java    | 126 +++++++++
 .../java/com/eports/ad/ms/mapper/LineUpMapper.java |  10 +
 .../com/eports/ad/ms/mapper/TerminalMapper.java    |   5 +
 .../com/eports/ad/ms/service/LineUpService.java    |  12 +
 .../com/eports/ad/ms/service/TerminalService.java  |   4 +
 .../ad/ms/service/impl/LineUpServiceImpl.java      | 150 ++++++++++-
 .../ad/ms/service/impl/TerminalServiceImpl.java    |   8 +
 .../java/com/eports/ad/ms/shiro/AuthRealm.java     |  11 +-
 .../java/com/eports/ad/ms/shiro/ShiroConfig.java   |   1 -
 src/main/java/com/eports/ad/ms/util/AESUtil.java   | 114 ++++++++
 src/main/java/com/eports/ad/ms/util/FileUtils.java |  57 +++-
 src/main/java/com/eports/ad/ms/util/ToolUtil.java  | 265 ++++++++++++++++++
 src/main/java/com/eports/ms/shiro/ShiroUser.java   |   7 +-
 src/main/resources/mapper/LineUpMapper.xml         |  24 ++
 src/main/resources/mapper/TerminalMapper.xml       |   5 +
 src/main/resources/templates/lineUp/list.ftl       | 297 +++++++++------------
 src/main/resources/templates/login.ftl             |  96 +------
 28 files changed, 1446 insertions(+), 280 deletions(-)
 create mode 100644 src/main/java/com/eports/ad/ms/entity/vo/TerminalBasicVO.java
 create mode 100644 src/main/java/com/eports/ad/ms/entity/vo/TerminalWithLineUpVO.java
 create mode 100644 src/main/java/com/eports/ad/ms/exception/GlobalExceptionHandler.java
 create mode 100644 src/main/java/com/eports/ad/ms/exception/MyException.java
 create mode 100644 src/main/java/com/eports/ad/ms/log/Log.java
 create mode 100644 src/main/java/com/eports/ad/ms/log/SysLog.java
 create mode 100644 src/main/java/com/eports/ad/ms/log/WebLogAspect.java
 create mode 100644 src/main/java/com/eports/ad/ms/util/AESUtil.java
 create mode 100644 src/main/java/com/eports/ad/ms/util/ToolUtil.java

xu_bob@DESKTOP-NVM39PS MINGW64 /d/E-Ports/ad-ms/ad-ms (test)

xu_bob@DESKTOP-NVM39PS MINGW64 /d/E-Ports/ad-ws-order (master)
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/master
  remotes/origin/test

2.7 git 更新远程分支列表

# 远程添加分支后,更新远程分支列表
xu_bob@DESKTOP-NVM39PS MINGW64 /d/E-Ports/ad-ws-order (master)
$ git remote update origin -p  
Fetching origin
From repo.e-ports.com:e-ports/ad-ws-order
 * [new branch]      test       -> origin/test

2.8 git 提交到本地仓库

撤消上一次commit的内容(该操作会彻底回退到某个版本,本地的源码也会变为上一个版本的内容) git reset --hard

以下表示要撤消“update build gradle configuration file”这一次的commit id,返回到"add battery settings ui"这一次的commit id,
xp.chen@YC-JG-YXKF-PC27 MINGW64 /f/ob ((c8303a9…))

$ git log
commit c8303a9e8db2bcf4edb7488e722a380f4e8858ec (HEAD)
Author: xp.chen <[email protected]>
Date:   Sat Oct 28 09:28:51 2017 +0800

    update build gradle configuration file

    Change-Id: I9ee532fd0d4698613698a64eb754fb98a8559e32

commit 8d8e5ccf24cf6836ab780aa3860270c3876e825a
Author: xp.chen <[email protected]>
Date:   Sat Oct 28 09:02:01 2017 +0800

    add battery settigns ui

    Change-Id: Ia907ee4e84f54c00a186d31378a7925a6adaba0e

xp.chen@YC-JG-YXKF-PC27 MINGW64 /f/ob ((c8303a9...))
$ git reset --hard 8d8e5ccf24cf6836ab780aa3860270c3876e825a
HEAD is now at 8d8e5cc add battery settigns ui

xp.chen@YC-JG-YXKF-PC27 MINGW64 /f/ob ((8d8e5cc...))
$ git log
commit 8d8e5ccf24cf6836ab780aa3860270c3876e825a (HEAD)
Author: xp.chen <[email protected]>
Date:   Sat Oct 28 09:02:01 2017 +0800

    add battery settigns ui

    Change-Id: Ia907ee4e84f54c00a186d31378a7925a6adaba0e
  1. git commit -m 注释换行

git commit -m 注释可以通过单引号来换行,比如:

$ git commit -m '
> 1.aaaaa
> 2.bbbb
> '
[master b25154b] 1.aaaaa 2.bbbb
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 ss.txt
 
# 通过`git commit --amend` 命令可以查看到刚刚的log信息为
1.aaaaa
2.bbbb

2.9 git revert 用法

git revert 撤销 某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销
作为一次最新的提交
* git revert HEAD 撤销前一次 commit
* git revert HEAD^ 撤销前前一次 commit
* git revert commit (比如:fa042ce57ebbe5bb9c8db709f719cec2c58ee7ff)撤销指定的版本,撤销也会作为一次提交进行保存。
git revert是提交一个新的版本,将需要revert的版本的内容再反向修改回去,
版本会递增,不影响之前提交的内容


git revert 和 git reset的区别

  1. git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。
  2. 在回滚这一操作上看,效果差不多。但是在日后继续merge以前的老版本时有区别。因为git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现,但是git reset是之间把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入。
  3. git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。

2.10 git 比较本地仓库和远程仓库的差异

判断的条件是本地的Git_Commit跟远端进行对比,不一致就代表有新的代码提交,执行操作,否则exit

# 更新本地的远程分支
git fetch origin
2.本地与远程的差集 :(显示远程有而本地没有的commit信息),git比较本地仓库和远程仓库的差异
git log master..origin/master
3.统计文件的改动
# git diff  /
git diff --stat master origin/master

3 脚本

#!/bin/bash
# Comments to support chkconfig on Linux
# chkconfig: 2345 64 36
 
# Author : deng.gonghai
# Date   : 2016-08-29
 
# ======================================
# Script for the xxx Server
# ======================================

未完待续……

你可能感兴趣的:(git)