目的
作为开发很多命令不经常用的话会忘记,特别是对于英语不是很好的同学,这里记录一下自己使用过的git相关功能和方法,以便后续忘记或者有新的使用心也可以再次记录更新.
环境
Linux-Ubuntu 18.04
从无到有
1.安装git
sudo apt-get install git
2.用户邮箱配置
git config -- global user.name shenghuajiang //配置用户名
git config --global user.email shenghuajiang@xx.com.cn //配置邮箱
git config --list //查看配置信息,是否配置成功
3.SSH秘钥生成
git服务器一般使用 SSH 公钥进行认证,因此客户端需提供公钥保存在git服务器上,默认本地SSH秘钥放在~/.ssh 目录下
jshh@jeson-ThinkPad-T470:~/.ssh$ ls
id_rsa id_rsa.pub known_hosts
如果没有id_rsa 和 id_rsa.pub文件,则主动生成如下:
jshh@jeson-ThinkPad-T470:ssh-keygen
或者生成指定邮箱的公钥
jshh@jeson-ThinkPad-T470:ssh-keygen -t rsa -C"your_email@youremail.com"
ssh-keygen 会确认密钥的存储位置(默认是 .ssh/id_rsa),然后它会要求你输入两次密钥口令。如果你不想在使用密钥时输入口令,将其留空即可。
生成公钥之后,我们将id_rsa.pub文件读取出来,复制粘贴放到git 服务器(设置中添加秘钥即可),这样客户端连接指定服务器时,服务器进行秘钥解密成功之后就可以正常使用git仓库了.
jshh@jeson-ThinkPad-T470:~/.ssh$ cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDsMMtAENJ0kNIEIKMtIPLxAC8KyoAjZUAAeYma8Y9qq/1Lcl7ZXlFGDWu5JLKb3KgfNWSPJlkMG0FJmMMVuI0kogjY7WQ1iJDdVRZ4m2Cw4olv2D2uJlskHYs8TgojoMEEeRj7u6UNCxZN1x2xY2NGefb3vLySZD1pEn/I6u5TOSUk5fPIshenghuajiang@xxx.com.cn
git 常用命令
- 代码克隆,直接从远程仓库克隆project, 从服务如图,左侧点击clone,copy clone地址
jshh@jeson-ThinkPad-T470:~/Project/code/XCMedia2/temp$ git clone ssh://shenghuajiang@xcserver:29418/gkui/apps/XCMedia2
Cloning into 'XCMedia2'...
remote: Counting objects: 2186, done
remote: Finding sources: 100% (177/177)
remote: Total 23820 (delta 31), reused 23736 (delta 31)
Receiving objects: 100% (23820/23820), 180.96 MiB | 29.53 MiB/s, done.
Resolving deltas: 100% (12230/12230), done.
jshh@jeson-ThinkPad-T470:~/Project/code/XCMedia2/temp$ ls
XCMedia2
git pull //同步更新至本地仓库
git pull --rebase // 本地有一次commit,但是未push上传的情况下想直接pull更新并且commit不会被二次merge,将commit changeid始终保存在栈顶
git status //查看本地修改状态
git log //查看修改记录-- commit记录
git add xx.c //添加进备提交
git commit //将备提交中的文件进行提交
git commit --amend //修改最后一次commit的描述或内容, 不新增changeId
git push origin HEAD:refs/for/master //上传同步到远程仓库 'master’是对应分支
git push origin HEAD:refs/changes/272881 //上传同步到指定change,不增加新的changeId,'272881’是对于的change
git reset HEAD~ //重置HEAD, 只是重置了仓库记录,文件内容不会修改,增加多次的话可以HEAD~3 修改数字即可
git reset --soft --hard //重置恢复文件,所有修改的文件全部恢复与仓库记录一致,新增的文件不做删除处理
git clean -df //清除多余的文件文件夹或文件, 完全与仓库一致
如果某个仓库数据较大,而我们只需要其中某个分支数据时,可做如下处理:
sync: git clone -b {branch} --single-branch --depth=1 ssh://xcserver:29418/gkui/delivery/GKAIDelivery {local patch}
git stash 这个功能功能很好用,这里多记录一下
git stash list
查看所有stash 记录
$ git stash list
jshh@jeson-ThinkPad-T470:~/Project/code/XCMedia2/temp/XCMedia2$ git stash list
stash@{0}: WIP on master: 780b84b1 opt: 爱听运营SDK 拉取单曲信息以BITRATE_128K 参数
stash@{1}: WIP on master: 780b84b1 opt: 爱听运营SDK 拉取单曲信息以BITRATE_128K 参数
git stash
会把所有未提交的修改(包括暂存的和非暂存的)都保存起来,用于后续恢复当前工作目录。
如下: 新增文件 bd, 进行本地存储
jshh@jeson-ThinkPad-T470:~/Project/code/XCMedia2/temp/XCMedia2$ touch bd
jshh@jeson-ThinkPad-T470:~/Project/code/XCMedia2/temp/XCMedia2$ git stash -a
Saved working directory and index state WIP on master: 780b84b1 opt: 爱听运营SDK 拉取单曲信息以BITRATE_128K 参数
jshh@jeson-ThinkPad-T470:~/Project/code/XCMedia2/temp/XCMedia2$ git stash list
stash@{0}: WIP on master: 780b84b1 opt: 爱听运营SDK 拉取单曲信息以BITRATE_128K 参数
stash@{1}: WIP on master: 780b84b1 opt: 爱听运营SDK 拉取单曲信息以BITRATE_128K 参数
stash@{2}: WIP on master: 780b84b1 opt: 爱听运营SDK 拉取单曲信息以BITRATE_128K 参数
git stash save 'flag’
记录的同步可以添加message, 以后翻看记录时容易知道是哪一笔stash
jshh@jeson-ThinkPad-T470:~/Project/code/XCMedia2/temp/XCMedia2$ touch bbb
jshh@jeson-ThinkPad-T470:~/Project/code/XCMedia2/temp/XCMedia2$ git stash save -a Untracked-files-bbb
Saved working directory and index state On master: Untracked-files-bbb
jshh@jeson-ThinkPad-T470:~/Project/code/XCMedia2/temp/XCMedia2$ git stash list
stash@{0}: On master: Untracked-files-bbb
stash@{1}: WIP on master: 780b84b1 opt: 爱听运营SDK 拉取单曲信息以BITRATE_128K 参数
stash@{2}: WIP on master: 780b84b1 opt: 爱听运营SDK 拉取单曲信息以BITRATE_128K 参数
stash@{3}: WIP on master: 780b84b1 opt: 爱听运营SDK 拉取单曲信息以BITRATE_128K 参数
git stash pop
将最近或者说栈顶的一笔stash恢复,并删除此次stash
// stash list 4条记录
jshh@jeson-ThinkPad-T470:~/Project/code/XCMedia2/temp/XCMedia2$ git stash list
stash@{0}: On master: Untracked-files-bbb
stash@{1}: WIP on master: 780b84b1 opt: 爱听运营SDK 拉取单曲信息以BITRATE_128K 参数
stash@{2}: WIP on master: 780b84b1 opt: 爱听运营SDK 拉取单曲信息以BITRATE_128K 参数
stash@{3}: WIP on master: 780b84b1 opt: 爱听运营SDK 拉取单曲信息以BITRATE_128K 参数
jshh@jeson-ThinkPad-T470:~/Project/code/XCMedia2/temp/XCMedia2$
//git status 与远程仓库完全一致,没有任何修改
jshh@jeson-ThinkPad-T470:~/Project/code/XCMedia2/temp/XCMedia2$ git status
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
//git stash pop ,恢复栈顶的一笔stash 即stash@{0}
jshh@jeson-ThinkPad-T470:~/Project/code/XCMedia2/temp/XCMedia2$ git stash pop
Already up to date!
On branch master
Your branch is up to date with 'origin/master'.
Untracked files:
(use "git add <file>..." to include in what will be committed)
bbb
nothing added to commit but untracked files present (use "git add" to track)
Dropped refs/stash@{0} (f31cab9493d7bbac1719077195f6f5a7df0da5aa)
//可以看到bbb文件被恢复了,此时再stash list看下只剩3笔stash 之前的栈顶bbb的记录已经被删除
jshh@jeson-ThinkPad-T470:~/Project/code/XCMedia2/temp/XCMedia2$ git stash list
stash@{0}: WIP on master: 780b84b1 opt: 爱听运营SDK 拉取单曲信息以BITRATE_128K 参数
stash@{1}: WIP on master: 780b84b1 opt: 爱听运营SDK 拉取单曲信息以BITRATE_128K 参数
stash@{2}: WIP on master: 780b84b1 opt: 爱听运营SDK 拉取单曲信息以BITRATE_128K 参数
git stash apply
与pop功能一样,但是不会删除被恢复的stash, 并且可增加stash名称恢复指定stash,
比如我们恢复stash@{2}这笔记录,可以看到新文件a被恢复了,但是stash list看stash2并没有被删除:
git stash apply stash@{2}
jshh@jeson-ThinkPad-T470:~/Project/code/XCMedia2/temp/XCMedia2$ git stash apply stash@{2}
Already up to date!
On branch master
Your branch is up to date with 'origin/master'.
Untracked files:
(use "git add <file>..." to include in what will be committed)
a
bbb
nothing added to commit but untracked files present (use "git add" to track)
jshh@jeson-ThinkPad-T470:~/Project/code/XCMedia2/temp/XCMedia2$ git stash list
stash@{0}: WIP on master: 780b84b1 opt: 爱听运营SDK 拉取单曲信息以BITRATE_128K 参数
stash@{1}: WIP on master: 780b84b1 opt: 爱听运营SDK 拉取单曲信息以BITRATE_128K 参数
stash@{2}: WIP on master: 780b84b1 opt: 爱听运营SDK 拉取单曲信息以BITRATE_128K 参数
git stash drop
后面可以跟着stash名字。删除一笔stash, 默认是删除栈顶的一个
git stash clear
删除所有缓存的stash。
git stash show
查看指定stash的diff,后面可以跟着stash名字
git stash show -p
可以查看特定stash的全部diff,详细的.
从stash创建分支
如果你储藏了一些工作,暂时不去理会,然后继续在你储藏工作的分支上工作,你在重新应用工作时可能会碰到一些问题。如果尝试应用的变更是针对一个你那之后修改过的文件,你会碰到一个归并冲突并且必须去化解它。如果你想用更方便的方法来重新检验你储藏的变更,你可以运行 git stash branch,这会创建一个新的分支,检出你储藏工作时的所处的提交,重新应用你的工作,如果成功,将会丢弃储藏。
$ git stash branch testchanges
Switched to a new branch "testchanges"
# On branch testchanges
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: index.html
#
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
#
# modified: lib/simplegit.rb
#
Dropped refs/stash@{0} (f0dfc4d5dc332d1cee34a634182e168c4efc3359)
暂存未跟踪或忽略的文件
默认情况下,git stash会缓存下列文件:
- 添加到暂存区的修改(staged changes)
- Git跟踪的但并未添加到暂存区的修改(unstaged changes)
但不会缓存一下文件:
- 在工作目录中新的文件(untracked files)
- 被忽略的文件(ignored files)
git stash命令提供了参数用于缓存上面两种类型的文件。使用-u或者–include-untracked可以stash untracked文件。
使用-a或者–all命令可以stash当前目录下的所有修改。
至于git stash的其他命令建议参考Git manual。