test
1.Git设置
1-1 生成一个SSH key
在
~/.ssh
目录下会生成id_rsa
和id_rsa.pub
文件把
id_rsa.pub
的内容放在github或者gitlab上
ssh-keygen -t rsa -C "your_email@example.com" //填写自己的邮箱
代码参数含义:
-t 指定密钥类型,默认是 rsa ,可以省略。
-C 设置注释文字,比如邮箱。
-f 指定密钥文件存储文件名。
1-2 配置
# 查看配置
git config --list //查看配置
git config --list --show-origin //查看所有配置文件
git config -e --global //直接进入全局配置修改
# 配置全局用户名和邮箱
git config --global user.name"lxd670"
git config --global user.email"lxd670@qq.com"
# 初始化本地仓库
git init
2.分支
2-1 查看分支
git branch
查看本地所有分支
git branch -r
查看远程所有分支
git branch -a
查看远程+本地所有分支
git branch
* master
2-2 查看有没有合并分支
git branch --merged
git branch --no-merged
加上分支名就可以指定,不加分支名相当于当前分支名作为参考
# 可以查看哪些分支已经合并到当前分支,此列表下没有* 标记的分支可以删除,不会报错。
git branch --merged
git branch --merged master
dev1
* master
# 查看还未合并到当前分支的分支,此时如果去删除未合并的分支,会报错的。与git branch --merged命令后边都可以加分支名称,这样可以查看指定分支的合并状态,而不用检出他们。
git branch --no-merged
git branch --no-merged master
dev2
2-3 创建分支
git branch [分支名]
git branch new1
* master
new1
2-4 切换分支
git checkout [分支名]
git checkout dev1
# 标签已经切换到dev1分支了
Switched to branch 'dev1'
2-5 创建+切换
git checkout -b [分支名]
git checkout -b dev2
# 本质git branch dev2 && git checkout dev2
Switched to a new branch 'dev2'
2-6 重命名分支
git branch -m [分支名] [新分支名]
git branch -m dev2 dev3
2-7 删除分支
2-7-1 删除本地分支
git branch -d [分支名]
orgit branch -D [分支名]
git branch -d new1
* master
2-7-2 删除远程分支
git push origin --delete [分支名]
git push origin -d [分支名]
git push origin :[分支名]
# 效果都一样
git push origin --delete dev1
git push origin -d dev1
git push origin :dev1
2-8 查看所有分支信息
git branch -v
git branch -v
# 也会显示是否超前或者落后几个版本
* master a9966256 [ahead 1] test1
dev1 as13e123 t1
2-9 查看当前的本地分支与远程分支的关联关系
git branch -vv
git branch -vv
# 表示和远程分支版本一样(对于远程分支的master)
* master a9966256 [origin/master] test1
# 表示落后远程分支2个版本
* master a9966256 [origin/master: behind 2] test1
# 表示超前远程分支1个版本
* master a9966256 [origin/master: ahead 1] test1
# 表示没有关联远程分支
* master a9966256 test1
2-10 关联远程分支
git branch -u origin/[远程分支]
把当前分支和远程分支做关联
git branch -u origin/[远程分支] [本地分支]
指定关联的分支名
git branch -u origin/master dev1
Branch 'dev1' set up to track remote branch 'master' from 'origin'.
2-11 本地分支推送到远程新建分支
# 把本地master分支推送带远端dev1分支
git push origin master:dev1
3.标签
3-1 创建tag
#轻量标签
# 在当前commit创建一个tag
git tag [tag_name]
# 在指定的commit_id上创建tag
git tag [tag_name] [commit_id]
# 附注标签
# 在当前commit创建一个tag+tag说明
git tag -a [tag_name] -m "tag message"
git tag -a [tag_name] [commit_id] -m "tag message"
3-2 查看tag
# 这个命令以字母顺序列出标签,但是它们显示的顺序并不重要
$ git tag
# 查找标签
$ git tag -l "v1.8.5*"
v1.8.5
v1.8.5-rc0
v1.8.5-rc1
v1.8.5-rc2
v1.8.5-rc3
v1.8.5.1
v1.8.5.2
v1.8.5.3
v1.8.5.4
v1.8.5.5
查看-附注标签
输出显示了打标签者的信息、打标签的日期时间、附注信息,然后显示具体的提交信息。
$ git show v1.4
tag v1.4
Tagger: Ben Straub <ben@straub.cc>
Date: Sat May 3 20:19:12 2014 -0700
my version 1.4
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
查看-轻量标签
只会显示出提交信息
$ git show v1.4-lw
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
3-3 删除tag
git tag -d [tag_name]
修改时更新git commit author date
commit 681039be4f644ff49938c2625dd82ecf1141b299 (HEAD -> master)
Author: lxd01243683 <lxd01243683@alibaba-inc.com>
Date: Mon Jun 20 11:21:09 2022 +0800
Adjust log records
# 方法一
git commit --amend --date="$(date -R)"
# 方法二
git commit --amend --reset-author
commit 995779586e65b5cdcce1ccbdc490303c6597c6e2 (HEAD -> master)
Author: lxd01243683 <lxd01243683@alibaba-inc.com>
Date: Tue Jun 21 09:44:53 2022 +0800
Adjust log records
查看本地
git logs
b2d1sd2 (modified:, 2022-06-23) # 本地修改(未提交到远程)
ab35dd8 (set 1.txt, 2022-06-23)
使用git pull拉取代码
git pull
# 表示自动合并失败
Auto-merging 1.txt
CONFLICT (content): Merge conflict in 1.txt
Automatic merge failed; fix conflicts and then commit the result.
git status
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: 1.txt
冲突文件
test
<<<<<<< HEAD
addadd # 这里是自己本地改动的
=======
1111 # 这里是远程改动的
>>>>>>> 22ee1d39e61f17798d73447a8c75080e0dc6fb4d
保留自己本地的
test
1111
保留远程的
test
addadd
同时保留
test
addadd
1111
同时删除
test
git add .
git commit -m 'ccc'
git logs
5f9f403 (ccc, 2022-06-23)
22ee1d3 (add 1111, 2022-06-23)
ab35dd8 (set 1.txt, 2022-06-23)
还原文件
取消git变动文件(没有添加到暂存区)
git restore [file_name] ...
git checkout -- [file_name] ...
取消暂存区文件到追加区
git restore --staged [file_name] ...
git reset HEAD [file_name] ...
修改已提交的commit信息
# 进入vim编辑
git commit --amend
# 直接修改
git commit --amend -m "xxxx"
列出commit-id对应的tag
git ls-remote --tags
From ssh://git@gitlab.alibaba-inc.com/hologram/holo-build.git
bacf34db2f543717a87aeea12332274359404060 refs/tags/0.10-rc4
41c1f88aacf368d4cb0762ee91bbe85c0cdc3403 refs/tags/0.10.0-rc0
f0c66526dcc0220be08ebf91af7789265278d753 refs/tags/0.10.0-rc1
4b6c2c9cbc3caa936de21bc45edba54710cfbd15 refs/tags/0.10.0-rc10
rev-parse打印hash值
--short
显示短的commit id
验证指定的对象是一个有效的 git 对象
# 成功返回commit id
git rev-parse --verify 804e239ee884c929e452f
804e239ee884c929e452f69602da523531df0498
# 错误
git rev-parse --verify 804e239ee884c92asdad
fatal: Needed a single revision
查看commit id
# 通过tag标签获取commit
git rev-parse 1.3.1-rc28
db7c8eaa4f1b0ca9f5afdb99fede7250d387f86b
# 获取当前的commit id
git rev-parse HEAD
9093ea3364666955cf3f882b5268dc943dc3c693
master分支改动的代码复制到其他分支
git clone xxxx.git xx_file
cd xx_file
git logs -3
# 获取最新的commit id
# 切换分支
git checkout release-1.3.x-tpch
# 把master的commit摘过来
git cherry-pick [commit-id]
本地有远程分支,但是远程已经被删除了
git branch -r 查看的是本地.git/refs/remotes/origin下的branch
# 查看远程情况
# tracked表示被跟踪的
git remote show origin
* remote origin
Fetch URL: git@gitlab.alibaba-inc.com:hologram/holo-build.git
Push URL: git@gitlab.alibaba-inc.com:hologram/holo-build.git
HEAD branch: master
Remote branches:
AddUsers tracked
aaa tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
# 都会清理无效的branch
# 远程同步,会自动修剪无用的branch
git fetch --prune
git remote prune
git checkout
# 使用-b时,如果分支名和远程分(已存在的)支名相同的话,不会关联
git checkout -b [branch_name]
# 如果创建的分支名和远程(已存在的)分支名一样,那么会自动关联
git checkout [branch_name]
# 查看本地分支关联情况
# behind表示落后于远程分支几次commit数量[origin/master: behind 3]
# ahead表示本地分支超前远程分支几次commit数量[origin/master: ahead 2]
git branch -vv
master d75eb370 [origin/master] "commit_message"
release-1.1.x fd683308 "commit_message"
* release-1.3.x 6a5e18b8 [origin/release-1.3.x] "commit_message"
# 同步远程分支
git checkout master && git merge origin/master
git fetch和git pull
git pull -r报错
如果文件被add了,但是没有commit时候,使用git pull -r会报错
# 报错
git pull -r
error: cannot pull with rebase: Your index contains uncommitted changes.
error: please commit or stash them.
# 查看状态
git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: plugin/ccc.py
解决方法一:撤销文件
# 把文件撤销
git restore --staged plugin/ccc.py
# 重新再pull
git pull -r
Already up to date.
解决方案二:stash文件
git stash
Saved working directory and index state WIP on master: 0c81090 [Holo to #42873391] xxxxx
git pull -r
Already up to date.
解决方案二:增加commit
git commit -m "test"
[master 314b0ce] test
1 file changed, 72 insertions(+)
create mode 100755 plugin/ccc.py
git pull -r
Successfully rebased and updated refs/heads/master.
push
# 把本地分支上传到远程分支
git push origin [xxxx]
# 把本地分支上传到远程分支,并且和远程分支绑定
git push -u origin [xxxx]
# 效果一样
git push -u origin ccc
git push origin 本地分支名:远程分支名
$git push origin ccc:ccc
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
To gitlab.alibaba-inc.com:lxd01243683/test.git
* [new branch] ccc -> ccc
git fetch origin refs/merge-requests/{code_id}/head
git cherry-pick FETCH_HEAD