zoukankan      html  css  js  c++  java
  • [skill][git] git 常用操作记录

    傻瓜入门: step by step : https://try.github.io/levels/1/challenges/1

    一本书: https://git-scm.com/book/en/v2

    竟然有中文版 O.O: https://git-scm.com/book/zh/v2/

    git实在是太复杂了,学呀学呀学不懂。只能一点点记下来,省得每次想好久。。。。

    0. 新环境里的第一次配置:

    [root@D128 Src]# git config --global user.name "Cao Tong"
    [root@D128 Src]# git config --global user.email "tong.caotong@gmail.com"

    0.1  generate ssh key

    [root@D128 Src]# ssh-keygen 

    0.2  add your pub key to your ssh repo server, like github

    0.3  下载代码

    [root@D128 Src]# git clone git@github.com:intel/hyperscan.git

    1. 丢弃所有修改

      两个命令一起用。

    /home/tong/Src/copyleft/libdssl [git::master *] [tong@T7] [13:53]
    > sudo git clean -xdf
    /home/tong/Src/copyleft/libdssl [git::master *] [tong@T7] [13:47]
    > git reset --hard

    2.  删除一个本地分支:

      git branch -d <branch-name>

    /home/tong/Src/thirdparty/github/msgpack-c [git::master] [tong@T7] [11:07]
    > git branch -l
      list
    * master
    
    /home/tong/Src/thirdparty/github/msgpack-c [git::master] [tong@T7] [11:08]
    > git branch -d list
    Deleted branch list (was c50fbe4c).
    
    /home/tong/Src/thirdparty/github/msgpack-c [git::master] [tong@T7] [11:08]
    > git branch -l     
    * master

    3.  创建git server

      在CentOS 7 环境下:

      参考: https://git-scm.com/book/zh/v2/%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84-Git-%E5%8D%8F%E8%AE%AE

      3.1  安装:

    [root@S205 log]# yum install git

      3.2  初始化仓库

    [root@S205 log]# su - git
    Last login: Mon Jun 19 20:04:06 CST 2017 on pts/0
    [git@S205 ~]$ mkdir anthropoid.git
    [git@S205 ~]$ cd anthropoid.git/
    [git@S205 anthropoid.git]$ git init --bare
    Initialized empty Git repository in /home/git/anthropoid.git/
    [git@S205 anthropoid.git]$ ll
    total 12
    drwxrwxr-x 2 git git   6 Jun 19 20:05 branches
    -rw-rw-r-- 1 git git  66 Jun 19 20:05 config
    -rw-rw-r-- 1 git git  73 Jun 19 20:05 description
    -rw-rw-r-- 1 git git  23 Jun 19 20:05 HEAD
    drwxrwxr-x 2 git git 242 Jun 19 20:05 hooks
    drwxrwxr-x 2 git git  21 Jun 19 20:05 info
    drwxrwxr-x 4 git git  30 Jun 19 20:05 objects
    drwxrwxr-x 4 git git  31 Jun 19 20:05 refs

      3.3  增加公钥,授予权限

      3.4  设置git shell

    [root@S205 ~]# which git-shell >> /etc/shells
    [root@S205 ~]# cat /etc/shells 
    /bin/sh
    /bin/bash
    /sbin/nologin
    /usr/bin/sh
    /usr/bin/bash
    /usr/sbin/nologin
    /bin/tcsh
    /bin/csh
    /usr/bin/git-shell
    [root@S205 ~]# chsh git
    Changing shell for git.
    New shell [/bin/bash]: /usr/bin/git-shell
    Shell changed.
    [root@S205 ~]# su - git
    Last login: Mon Jun 19 20:35:34 CST 2017 from 192.168.50.20 on pts/1
    fatal: Interactive git shell is not enabled.
    hint: ~/git-shell-commands should exist and have read and execute access.
    [root@S205 ~]# 

      3.5  在原项目里创建新分支

    /home/tong/Src/copyleft/potatos [git::master *] [tong@T7] [20:15]
    > git branch anthropoid
    
    /home/tong/Src/copyleft/potatos [git::master *] [tong@T7] [20:15]
    > git branch          
      anthropoid
      hally
    * master
    
    /home/tong/Src/copyleft/potatos [git::master *] [tong@T7] [20:15]
    > git checkout anthropoid
    Switched to branch 'anthropoid'
    
    /home/tong/Src/copyleft/potatos [git::anthropoid *] [tong@T7] [20:15]

       3.6  push第一个版本

    /home/tong/Src/copyleft/potatos [git::master *] [tong@T7] [20:56]
    > git push origin anthropoid:master          
    X11 forwarding request failed on channel 0
    Counting objects: 139, done.
    Delta compression using up to 4 threads.
    Compressing objects: 100% (135/135), done.
    Writing objects: 100% (139/139), 34.86 KiB | 0 bytes/s, done.
    Total 139 (delta 69), reused 0 (delta 0)
    To s205:/home/git/anthropoid.git
     * [new branch]      anthropoid -> master

       3.7  从新仓库clone

    /home/tong/Src/copyright/onescorpion [tong@T7] [20:58]
    > git clone git@s205:/home/git/anthropoid.git
    Cloning into 'anthropoid'...
    X11 forwarding request failed on channel 0
    remote: Counting objects: 139, done.
    remote: Compressing objects: 100% (66/66), done.
    remote: Total 139 (delta 69), reused 139 (delta 69)
    Receiving objects: 100% (139/139), 34.86 KiB | 0 bytes/s, done.
    Resolving deltas: 100% (69/69), done.

    4.  使本地仓库的仓库内容与某标签一致。

    检出标签
    在 Git 中你并不能真的检出一个标签,因为它们并不能像分支一样来回移动。 如果你想要工作目录与仓库中特定的标签版本完全一样,
    可以使用 git checkout
    -b [branchname] [tagname] 在特定的标签上创建一个新分支: $ git checkout -b version2 v2.0.0 Switched to a new branch 'version2' 当然,如果在这之后又进行了一次提交,version2 分支会因为改动向前移动了,那么 version2 分支就会和 v2.0.0 标签稍微有些不同,这时就应该当心了。

    参考: https://git-scm.com/book/zh/v2/Git-%E5%9F%BA%E7%A1%80-%E6%89%93%E6%A0%87%E7%AD%BE

    5.  让文件恢复到上一次提交时的样子

    git checkout -- [file] 

    6.  查看/获取远程分支

    > git branch -a
    > git checkout -b frame_feature origin/frame_feature

     7.   export 导出

    https://git-scm.com/docs/git-archive

    https://stackoverflow.com/questions/160608/do-a-git-export-like-svn-export

    好像是不行的。有人说用rsync:

    rsync -a ./FROM/ ./TO --exclude='.*'
    /home/tong/Src/thirdparty/pktgen-dpdk [git::pktgen-3.3.3] [tong@T7] [18:21]
    > git archive --format=tar.gz -o pktgen-3.3.3.tar.gz HEAD

    8.  git add 空文件夹

      git add 不能添加空文件夹。没有这个功能。 一般是在空文件夹下面放一个文件 .gitkeep

    https://git.wiki.kernel.org/index.php/GitFaq#Can_I_add_empty_directories.3F

    9.  git 重命名仓库

      9.1  

    [root@S205 git]# mv anthropoid.git/ crisp.git

      9.2

    /home/tong/Src/copyright/onescorpion [tong@T7] [14:23]
    > mv anthropoid crisp 

      9.3

    /home/tong/Src/copyright/onescorpion/crisp [git::develop *] [tong@T7] [14:23]
    > git remote -v 
    origin  git@s205:/home/git/anthropoid.git (fetch)
    origin  git@s205:/home/git/anthropoid.git (push)
    
    /home/tong/Src/copyright/onescorpion/crisp [git::develop *] [tong@T7] [14:23]
    > git remote set-url origin git@s205:/home/git/crisp.git     
    
    /home/tong/Src/copyright/onescorpion/crisp [git::develop *] [tong@T7] [14:29]
    > git remote -v                                         
    origin  git@s205:/home/git/crisp.git (fetch)
    origin  git@s205:/home/git/crisp.git (push)
    
    /home/tong/Src/copyright/onescorpion/crisp [git::develop *] [tong@T7] [14:29]
    > 

     10. 分支合并指定文件 / 从其他分支提取指定文件

    git checkout source_branch <paths>...

    http://ryanhoo.github.io/blog/2014/07/11/checkout-files-from-another-branch/

    http://jasonrudolph.com/blog/2009/02/25/git-tip-how-to-merge-specific-files-from-another-branch/

    无历史信息!

    11.  clone时,指定具体的tag.

    git clone --branch v1.6 git@github.com:hyperrealm/libconfig.git libconfig-v1.6

    glibc下载代码的指引, 不知道是不是相同的需求:

    git clone git://sourceware.org/git/glibc.git
    cd glibc
    git checkout --track -b local_glibc-2.26 origin/release/2.26/master

    https://www.gnu.org/software/libc/sources.html

     12. 重写最近一次提交的日志

    [11:36:53] tong@T7 /home/tong/Src/copyright/ (129) 
    > git commit --amend 

    13. git archive 的用法

    https://www.kernel.org/pub/software/scm/git/docs/git-archive.html 

    https://stackoverflow.com/questions/5995301/how-do-i-pipe-a-git-clone-to-archive-tar-or-gzip

    git archive --format=tar --remote=git@server:repo.git master | tar -xf -
    git archive --format=tar.gz -o pktgen-3.3.3.tar.gz HEAD

     14 git checkout 到指定版本

    ┬─[tong@T7:~/Src/]─[04:40:14 PM]
    ╰─>$ git checkout --detach 0e4dcf6cd69c2b9ca37bafd1a43dfede0f17542f
    HEAD is now at 0e4dcf6... fix bug: msgpack soa dns rr
    ┬─[tong@T7:~/Src/]─[04:40:31 PM]
    ╰─>$ git branch
    * (HEAD detached at 0e4dcf6)
      master
    ┬─[tong@T7:~/Src/]─[04:40:40 PM]
    ╰─>$ 

    15 git 从指定版本退回

    ┬─[tong@T7:~/Src/copyright/strongswan]─[05:46:41 PM] 
    ╰─>$ git revert 4e77d9939af9ac6f06b95516399ed302d0df10fe
    ┬─[tong@T7:~/Src/copyright/strongswan]─[05:46:41 PM]
    ╰─>$ git push

    16 提交之后有一些内容忘记了提交

    例如,你提交后发现忘记了暂存某些需要的修改,可以像下面这样操作:
    
    $ git commit -m 'initial commit'
    $ git add forgotten_file
    $ git commit --amend
    最终你只会有一个提交 - 第二次提交将代替第一次提交的结果。

    17 临时分支到某个tag

    root@D128 ~/S/t/pktgen-dpdk.git# git checkout --detach pktgen-3.5.0
    HEAD is now at 46f697c... fix typo
    root@D128 ~/S/t/pktgen-dpdk.git# git branch
    * (detached from pktgen-3.5.0)
      master

     18 清理工作目录

    # git clean -fd

     19  取出某个commit 作为patch,并patch到当前代码里

    root@D128 ~/S/c/j/j# git format-patch -1 9ca41ea4a56bfcab0fb6fcb6eea5ecb0a9e5103e
    0001-nlb_sched.patch
    root@D128 ~/S/c/j/j# git am 0001-nlb_sched.patch 
    Applying: nlb_sched: 1. unbind scheduler while service is really freeing. 2. support release_later feature for 'scheduler data'.

     am会增加commit log。只接受修改可使用apply

    root@D128 ~/S/c/j/j# git apply 0001-nlb_sched.patch

    20  查看git目录下的全部不在仓库里的数据

    git status --ignored -u

          清除他们

    git clean -x -f -d

    21 push用法

    $ git pull <远程主机名> <远程分支名>:<本地分支名>
    $ git pull origin next:master

    22 删除远端分支

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

    git push origin :test_branch

     

  • 相关阅读:
    RAID
    变量的内存位置
    OSI网络结构的七层模型 TCP/IP层次模型
    IT公司【应聘】
    ajax的一个最简单例子
    优先级反转问题
    问一道算法题:算出这些直线一共有多少个交点
    一个女研究生(高级测试工程师)的职业选择 ZZ
    使用SWIG实现C/C++与其他语言间的互相调用 zz
    创建系统级热键 C++ builder为例
  • 原文地址:https://www.cnblogs.com/hugetong/p/6861029.html
Copyright © 2011-2022 走看看