[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
git archive --format=tar.gz -o OpenSSL_1_1_1i.tar.gz tags/OpenSSL_1_1_1i
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
2应用patch:
先检查patch文件:git apply --stat newpatch.patch
检查能否应用成功:git apply --check newpatch.patch
打补丁:git am --signoff < newpatch.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