个人是比较喜欢TortioseGit, 但有些方式在brush中使用更方便
设置帐户
git config --list
查看:
$ git config --list
user.name=hgy413
user.email=80718901@qq.com
设置账户(需要和github账户设置一致)
$ git config --global user.name hgy413
$ git config --global user.email 80718901@qq.com
取回推送所有分支
取回所有分支
https://stackoverflow.com/questions/10312521/how-to-fetch-all-git-branches
先git clone到本地,再执行:
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all
推送所有分支
git push --all <远程主机名>
或者用TortioseGit勾选Push all branches
本地仓库同时推送到多个远程仓库
方法1
使用 git remote add
命令
先查看一下远程仓库情况
$ git remote -v
origin http://scmadmin@120.76.145.146:8080/scm/git/boxtest/csvDemo (fetch)
origin http://scmadmin@120.76.145.146:8080/scm/git/boxtest/csvDemo (push)
再增加远程仓库
$ git remote add origin1 http://scmadmin@120.76.145.146:8080/scm/git/boxtest/csvDemo1
hgy413@DESKTOP-KHL137I MINGW64 /g/AndroidX/boxtest/csvDemo (master)
$ git remote -v
origin http://scmadmin@120.76.145.146:8080/scm/git/boxtest/csvDemo (fetch)
origin http://scmadmin@120.76.145.146:8080/scm/git/boxtest/csvDemo (push)
origin1 http://scmadmin@120.76.145.146:8080/scm/git/boxtest/csvDemo1 (fetch)
origin1 http://scmadmin@120.76.145.146:8080/scm/git/boxtest/csvDemo1 (push)
然后再使用相应的命令 push 到对应的仓库就行了。这种方法的缺点是每次要 push 两次。
git push origin master:master
git push origin1 master:master
用TortioseGit的话就直接选择一个远端或all push就好了。
方法2
先用git remote rm origin1删除方法1设置的,再使用 git remote set-url
命令
$ git remote set-url --add origin http://scmadmin@120.76.145.146:8080/scm/git/boxtest/csvDemo1
hgy413@DESKTOP-KHL137I MINGW64 /g/AndroidX/boxtest/csvDemo (master)
$ git remote -v
origin http://scmadmin@120.76.145.146:8080/scm/git/boxtest/csvDemo (fetch)
origin http://scmadmin@120.76.145.146:8080/scm/git/boxtest/csvDemo (push)
origin http://scmadmin@120.76.145.146:8080/scm/git/boxtest/csvDemo1 (push)
可以看到 github 远程仓库有两个 push 地址。这种方法的好处是每次只需要 push 一次就行了。
使用git remote set-url --delete origin http://scmadmin@120.76.145.146:8080/scm/git/boxtest/csvDemo1
可以移除。
如果origin
不存在,可以用 git remote add origin http://scmadmin@120.76.145.146:8080/scm/git/boxtest/csvDemo1
增加origin
合并多条本地commit为一条
git log
看下当前分支的提交情况,下图中有4个commit点。从先到后是:add1,add2,add3,add4
,我们要把add2,add3
这两个commit点合并成一个commit点。
$ git log
commit ce658abc07408399a45bc36d89063b896f8d601c (HEAD -> master)
add4
commit 69da28343c9e244f6a8239cc3fab884029c2a7e5
add3
commit ecfa1dac8a4eb57f2adfb01b8a0f8567eb14b861
add2
commit e58ce6c7418c4900f5ee1a3634301c8adda97d13
add1
注意,在英文状态下按Q才能退出git log
。
运行下面的命令:这里面的commitId
是你要合并的两个commit之前的commitId
。也就是add1
的commitId
:e58ce6c7418c4900f5ee1a3634301c8adda97d13
git rebase -i commitId
接着我们就进入到 vi 的编辑模式
pick ecfa1da add2
pick 69da283 add3
pick ce658ab add4
# Rebase e58ce6c..ce658ab onto e58ce6c (3 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
上面有命令帮助
p,pick 的意思是要会执行这个 commit
s,squash 的意思是这个 commit 会被合并到前一个commit,会将该 commit 的注释添加到上一个 commit 注释中,注意是前一个,可以看到add3是后提交的,它现在要合到前面的add2中。
f, fixup 和squash一样,但它会放弃当前commit的注释。
在键盘上敲i键进入插入模式,修改成:
pick ecfa1da add2
s 69da283 add3
pick ce658ab add4
修改完成后,按esc键进入命令模式,再输出:wq
保存文件并退出vi,之后会继续跳转到commit message 的编辑界面:
# This is a combination of 2 commits.
# This is the 1st commit message:
add2
# This is the commit message #2:
add3
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date: Sun Jan 13 14:46:23 2019 +0800
#
# interactive rebase in progress; onto e58ce6c
# Last commands done (2 commands done):
# pick ecfa1da add2
# squash 69da283 add3
# Next command to do (1 remaining command):
# pick ce658ab add4
# You are currently rebasing branch 'master' on 'e58ce6c'.
注释中有写第一个commit信息和第二个commit信息,我这边合并成如下信息(直接把第二条记录删除了,第一条记录改为add2=add3:
# This is a combination of 2 commits.
# This is the 1st commit message:
add2=add3
# This is the commit message #2:
修改完成后,按esc键进入命令模式,再输出:wq
保存文件并退出vi,跳回到最初的命令界面:
hgy413@DESKTOP-KHL137I MINGW64 /g/AndroidX/luluboxtest/csvDemo (master)
$ git rebase -i e58ce6c7418c4900f5ee1a3634301c8adda97d13
[detached HEAD 260e642] add2=add3
Date: Sun Jan 13 14:46:23 2019 +0800
1 file changed, 2 insertions(+)
Successfully rebased and updated refs/heads/master.
Successfully !
再git log
看一下commit情况:
$ git log
commit 9155db8f93ffddb690fb058a5e5e863523fafbdc (HEAD -> master)
add4
commit 260e642309a6c174789ce31a334d2cc58ef62935
add2=add3
commit e58ce6c7418c4900f5ee1a3634301c8adda97d13
add1
可以看到,合并成功了,这时 git status
后会看到,提示让你git pull
一下
$ git status
On branch master
Your branch is ahead of 'origin/master' by 3 commits.
(use "git push" to publish your local commits)
千万不要这样做!否则你会发现这三条白合并了,还平白多了两条commit。
这时候,需要强制push上去 git push -f
, 当然要确保强制push不会覆盖了别人的代码。
Git合并某个分支的一个commit到另一个分支
例如要将A分支的一个commit合并到B分支:
首先切换到A分支
git checkout A
git log
找出要合并的commit ID :
e30f83897498e5aad781c5180e1b88b1df11c5a0
然后切换到B分支上
git checkout B
git cherry-pick e30f83897498e5aad781c5180e1b88b1df11c5a0
GIT 子模块
Git 子模块允许你将一个 Git 仓库作为另一个 Git 仓库的子目录。 它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立。
git submodule add https://xxx.git vbox-lib
这时会把https://xxx.git下载到 vbox-lib中,同时,在根目录生成.gitmodules
文件,打开,可以看到以下内容:
[submodule "vbox-lib"]
path = vbox-lib
url = https://xxx.git
如果我们要指定分支,只需在.gitmodules
文件中加入branch
, 比如:
[submodule vbox-lib"]
path = vbox-lib
url = https://xxx.git
branch = xx_feature
查看子模块:
$ git submodule
-e33f854d3f51f5ebd771a68da05ad0371a3c0570 xx文件夹
子模块前面有一个-
,说明子模块文件还未检入(空文件夹)。
初始化子模块:
git submodule init
初始化模块只需在克隆父项目后运行一次
更新子模块:
git submodule update
递归克隆整个项目:
git clone https://xxx.git xxx文件夹 --recursive