git命令
git 从远程仓库获取所有分支
方法一:
git clone只能clone远程库的master分支,无法clone所有分支,解决办法如下:
- 找一个干净目录,假设是git_work
- cd git_work
- git clone http://myrepo.xxx.com/project/.git ,这样在git_work目录下得到一个project子目录
- cd project
- git branch -a,列出所有分支名称如下:
remotes/origin/dev
remotes/origin/release - git checkout -b dev origin/dev,作用是checkout远程的dev分支,在本地起名为dev分支,并切换到本地的dev分支
- git checkout -b release origin/release,作用参见上一步解释
- git checkout dev,切换回dev分支,并开始开发。
方法二:
git clone xxx
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done(仅当服务器上有本地分支未跟踪的远程分支时,才运行)
# 获取远程所有分支
git fetch --all
# 更新跟踪远程分支的本地分支
git pull --all
fetch
更新远程分支的本地副本,因此这对于本地分支始终是安全的,但:
fetch
不会更新本地分支(跟踪远程分支);如果要更新本地分支,则仍然需要拉出每个分支。fetch
不会创建本地分支(跟踪远程分支),您必须手动执行此操作。如果要列出所有远程分支:git branch -a
git放弃本地已修改文件
本地有修改和提交,如何强制用远程的库更新更新。我尝试过用git pull -f,总是提示 You have not concluded your merge. (MERGE_HEAD exists)。
我需要放弃本地的修改,用远程的库的内容就可以,应该如何做?傻傻地办法就是用新的目录重新clone一个,正确的做法是什么?
正确的做法应该是:
git fetch --all
git reset --hard origin/master
git fetch 只是下载远程的库的内容,不做任何的合并git reset 把HEAD指向刚刚下载的最新的版本
git创建分支并推送到远程分支
1、查看当前分支:git branch
2、在当前分支基础上新建分支:git checkout -b 本地分支名
3、推送远程:$ git push origin 远程分支名:本地分支名
删除远程分支
推送一个空分支到远程分支,其实就相当于删除远程分支:
git push origin :分支名
也可以使用:
git push origin --delete 分支名
git放弃本地文件修改
写代码时,本来想切换到主分支,但是切换失败,因为我本地的代码修改了,所以想要放弃本地修改的代码(或者有时代码改的乱七八糟想放弃本地修改)
1. 未使用git add 缓存代码
- 使用git checkout – filename,注意中间有–
git checkout -- filename
- 放弃所有文件修改 git checkout .
git checkout .
- 此命令用来放弃掉所有还没有加入到缓存区(就是 git add 命令)的修改:内容修改与整个文件删除
- 此命令不会删除新建的文件,因为新建的文件还没加入git管理系统中,所以对git来说是未知,只需手动删除即可
2. 已使用git add 缓存代码,未使用git commit
- 使用 git reset HEAD filename
git reset HEAD filename
- 放弃所有文件修改 git reset HEAD
git reset HEAD
- 此命令用来清除 git 对于文件修改的缓存。相当于撤销 git add 命令所在的工作。在使用本命令后,本地的修改并不会消失,而是回到了第一步1. 未使用git add 缓存代码,继续使用用git checkout – filename,就可以放弃本地修改
3. 已经用 git commit 提交了代码
- 使用 git reset --hard HEAD^ 来回退到上一次commit的状态
git reset --hard HEAD^
- 或者回退到任意版本git reset --hard commit id ,使用git log命令查看git提交历史和commit id
git reset --hard commit id
4、git commit之后,想撤销commit
写完代码后,我们一般这样
git add . //添加所有文件
git commit -m “本功能全部完成”
执行完commit后,想撤回commit,怎么办?
这样凉拌:
git reset --soft HEAD^
这样就成功的撤销了你的commit
注意,仅仅是撤回commit操作,您写的代码仍然保留。
说一下个人理解:
HEAD^的意思是上一个版本,也可以写成HEAD~1
如果你进行了2次commit,想都撤回,可以使用HEAD~2
至于这几个参数:
–mixed
意思是:不删除工作空间改动代码,撤销commit,并且撤销git add . 操作
这个为默认参数,git reset --mixed HEAD^ 和 git reset HEAD^ 效果是一样的。
–soft
不删除工作空间改动代码,撤销commit,不撤销git add .
–hard
删除工作空间改动代码,撤销commit,撤销git add .
注意完成这个操作后,就恢复到了上一次的commit状态。
顺便说一下,如果commit注释写错了,只是想改一下注释,只需要:
git commit --amend
git放弃本地commit
git reset --hard FETCH_HEAD
如果想放弃本地的文件修改,可以使用git reset --hard FETCH_HEAD,FETCH_HEAD表示上一次成功git pull之后形成的commit点。然后git pull
git子模块管理
常用命令:
git clone --recursive 递归的方式克隆整个项目
git submodule add
git submodule init 初始化子模块
git submodule update 更新子模块
git submodule foreach git pull 拉取所有子模块
git submodule foreach git checkout master 批量切换所有子模块到 master ,
git submodule foreach + git命令
git submodule update --remote --merge, 批量合并
例子:
git submodule add 子模块git地址 子模块添加路径(放在项目的哪个目录)
添加子模块:git submodule add http://172.30.3.50/nuonuo-taxdeclaration/tax-declare-neimenggu.git scrapy/neimeng_access
执行主项目更新:git pull,再执行子模块更新:git submodule update --remote
git submodule foreach
git clone 含有子模块的项目
当一个 git 项目包含子模块(submodule) 时,直接克隆下来的子模块目录里面是空的
有两种方法解决:
方法一
如果项目已经克隆到了本地,执行下面的步骤:
1、初始化本地子模块配置文件
git submodule init
2、更新项目,抓取子模块内容
git submodule update
方法二
另外一种更简单的方法,就是在执行 git clone
时加上 --recursive
参数。它会自动初始化并更新每一个子模块。例如:
git clone --recursive https://github.com/example/example.git