Git 常用命令

个人是比较喜欢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。也就是add1commitIde58ce6c7418c4900f5ee1a3634301c8adda97d13

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 

参考:
Git submodule 子模块的管理和使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值