文章目录
1、切换到远程分支
A) 查看远程分支
参数说明:
-a: 全部分支(本地+远程)
-v: verbose,将commitId与注释都冗余显示出来
.
git branch -av
master 64660433 Add new file * prod afcd903c [behind 6] commit注释1 test 4cbc8d49 commit注释1 test_new c3ce99d9 commit注释1 uat 34dce62d 修改项目ReadMe说明文件 remotes/origin/HEAD -> origin/master remotes/origin/master 64660433 Add new file remotes/origin/prod 4cbc8d49 commit注释1 remotes/origin/test 4cbc8d49 commit注释1 remotes/origin/test_new c3ce99d9 commit注释1 remotes/origin/uat 34dce62d 修改项目ReadMe说明文件
B) 切换到远程分支:
git checkout -t origin/dev
C) 本地查找并切换到远程分支上
新clone一个项目初,本地可能只有一个*master分支
查找所有分支(本地+远程):
$ `git branch -a`
* master
remotes/origin/HEAD -> origin/master
remotes/origin/dev
remotes/origin/master
remotes/origin/pro
remotes/origin/uat
除了master分支为绿色外, 其他应该为红色。
`本地新建分支dev,并将本地与远程分支映射上`
$ git checkout -b dev remotes/origin/dev
Updating files: 100% (3398/3398), done.
Switched to a new branch 'dev'
Branch 'dev' set up to track remote branch 'dev' from 'origin'.
user@DESKTOP-123456 MINGW64 ~/IdeaProjects/project1 (dev)
$ git branch
* dev
master
2、Git删除远程分支或文件
2.1 删除远程分支
语法:
git push origin :${BRANCH_NAME}
或
git push origin --delete ${BRANCH_NAME}
.
.
引申:删除本地分支
语法:
git branch -D ${LOCAL_BRANCH_NAME}
说明:删除本地分支前,需要切换至其他分支下,如当前在prod分支下,可以切换至test分支下,再执行删除本地prod分支操作。
.
举例:
$ git branch -D prod
Deleted branch prod (was 01d7a091).
样例:
$ git push origin :test_deploy_20201127
To https://git.company.com/bigData/shedudma.git
- [deleted] test_deploy_20201127
下面这种语法,效果一样:
$ git push origin --delete test_uat
To https://git.company.com/bigData/shedudma.git
- [deleted] test_uat
2.2 删除远程文件
说明 :
直接删除远程文件, 不影响本地文件.
原理:
先在本地分支上删除指定的文件,再将操作推送至远程分支。
D:\IdeaProjects\aaaa>git rm -r --cached aaaa.iml
rm 'aaaa.iml'
D:\IdeaProjects\aaaa>git commit -m "delete project's *.iml file"
[master 8d1b8fc] delete project's *.iml file
1 file changed, 93 deletions(-)
delete mode 100644 aaaa.iml
D:\IdeaProjects\aaaa>git push
Counting objects: 2, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 231 bytes | 0 bytes/s, done.
Total 2 (delta 1), reused 0 (delta 0)
To ssh://xx.xx.xx.xx:port/xxdata/aaaa.git
9bb6f15..8d1b8fc master -> master
3、Git tag 操作
3.1 查看本地tag list
Administrator@WIN-SIMFTB9JNU1 MINGW64 /d/test/dockerutils (master)
$ git tag
v2019u0425
v2019u0605
3.2 创建本地tag
$ git tag -a v2019u0605 -m “v2019u0605”
引申:基于某个历史版本打tag
git tag -a v.1.0.0 -m “测试tag:未验收说明&6项履约开发前版本” aa4f6620
3.3 推送本地tag到远程Tags列表里
$ git push origin v2019u0605
Counting objects: 1, done.
Writing objects: 100% (1/1), 155 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To http://11.11.11.11/aidata/dockerutils.git
* [new tag] v2019u0605 -> v2019u0605
3.4 删除本地tag
$ git tag -d v2019u0605
Deleted tag ‘v2019u0605’ (was 35cd557)
3.5 推送本地删除到远程(即删除远程tag)
$ git push origin :refs/tags/v2019u0605
To http://11.11.11.11/aidata/dockerutils.git
- [deleted] v2019u0605
3.6 恢复本地误删除的文件
如在本人github项目python3_toturial下载到本地后,由于某种原因误删了com文件夹,
Administrator@WIN-SIMFTB9JNU2 MINGW64 /d/SourceCode/python3_toturial (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted: com/__init__.py
deleted: com/david/__init__.py
deleted: com/david/tutorial/1-base/1.1-datatypevariable.py
deleted: com/david/tutorial/1-base/1.2-dict & set.py
deleted: com/david/tutorial/1-base/1.2-string&encoding.py
deleted: com/david/tutorial/1-base/1.3-list&tuple.py
deleted: com/david/tutorial/1-base/1.4-condition.py
deleted: com/david/tutorial/1-base/1.5-loop.py
deleted: com/david/tutorial/1-base/__init__.py
deleted: com/david/tutorial/2-function/2.1-invokefunc.py
deleted: com/david/tutorial/2-function/2.2-definefunc.py
deleted: com/david/tutorial/2-function/2.3-funcparams.py
deleted: com/david/tutorial/2-function/2.4-recurtionFunc.py
deleted: com/david/tutorial/2-function/__init__.py
deleted: com/david/tutorial/3-advancedFeatures/3.1-slice.py
deleted: com/david/tutorial/3-advancedFeatures/3.2-iter.py
deleted: com/david/tutorial/3-advancedFeatures/3.3-listComp.py
deleted: com/david/tutorial/3-advancedFeatures/3.4-generator.py
deleted: com/david/tutorial/3-advancedFeatures/__init__.py
deleted: com/david/tutorial/4-fp/1-highOrderFunc/4.1.1-mapreduce.py
deleted: com/david/tutorial/4-fp/1-highOrderFunc/4.1.3-sorted.py
deleted: com/david/tutorial/4-fp/1-highOrderFunc/__init__.py
deleted: com/david/tutorial/4-fp/2-returnfunc.py
deleted: com/david/tutorial/4-fp/4.3-anonymousFunc.py
deleted: com/david/tutorial/4-fp/4.4-decorator.py
deleted: com/david/tutorial/4-fp/4.5-partialFunc.py
deleted: com/david/tutorial/4-fp/__init__.py
deleted: com/david/tutorial/5-modules/5.1-useModule.py
deleted: com/david/tutorial/5-modules/__init__.py
deleted: com/david/tutorial/__init__.py
deleted: com/david/tutorial/test.py
no changes added to commit (use "git add" and/or "git commit -a")
此时尝试重新拉取代码,实验证明无效果,无法将com文件夹从github服务器上再下载下来。
Administrator@WIN-SIMFTB9JNU2 MINGW64 /d/SourceCode/python3_toturial (master)
$ git pull
Already up-to-date.
正确的恢复步骤如下:
①、重置指针到头部位置:git reset HEAD ${错误删除的文件[夹]}
Administrator@WIN-SIMFTB9JNU2 MINGW64 /d/SourceCode/python3_toturial (master)
$ git reset HEAD com
Unstaged changes after reset:
D com/__init__.py
D com/david/__init__.py
D com/david/tutorial/1-base/1.1-datatypevariable.py
D com/david/tutorial/1-base/1.2-dict & set.py
D com/david/tutorial/1-base/1.2-string&encoding.py
D com/david/tutorial/1-base/1.3-list&tuple.py
D com/david/tutorial/1-base/1.4-condition.py
D com/david/tutorial/1-base/1.5-loop.py
D com/david/tutorial/1-base/__init__.py
D com/david/tutorial/2-function/2.1-invokefunc.py
D com/david/tutorial/2-function/2.2-definefunc.py
D com/david/tutorial/2-function/2.3-funcparams.py
D com/david/tutorial/2-function/2.4-recurtionFunc.py
D com/david/tutorial/2-function/__init__.py
D com/david/tutorial/3-advancedFeatures/3.1-slice.py
D com/david/tutorial/3-advancedFeatures/3.2-iter.py
D com/david/tutorial/3-advancedFeatures/3.3-listComp.py
D com/david/tutorial/3-advancedFeatures/3.4-generator.py
D com/david/tutorial/3-advancedFeatures/__init__.py
D com/david/tutorial/4-fp/1-highOrderFunc/4.1.1-mapreduce.py
D com/david/tutorial/4-fp/1-highOrderFunc/4.1.3-sorted.py
D com/david/tutorial/4-fp/1-highOrderFunc/__init__.py
D com/david/tutorial/4-fp/2-returnfunc.py
D com/david/tutorial/4-fp/4.3-anonymousFunc.py
D com/david/tutorial/4-fp/4.4-decorator.py
D com/david/tutorial/4-fp/4.5-partialFunc.py
D com/david/tutorial/4-fp/__init__.py
D com/david/tutorial/5-modules/5.1-useModule.py
D com/david/tutorial/5-modules/__init__.py
D com/david/tutorial/__init__.py
D com/david/tutorial/test.py
②、重新检出:git checkout ${错误删除的文件[夹]}
Administrator@WIN-SIMFTB9JNU2 MINGW64 /d/SourceCode/python3_toturial (master)
$ git checkout com
Administrator@WIN-SIMFTB9JNU2 MINGW64 /d/SourceCode/python3_toturial (master)
$ ll
total 0
drwxr-xr-x 1 Administrator 197121 0 十一 8 16:55 com/
4、Git merge 操作
4.1 开发分支合并到master
git checkout dev
git pull
git checkout master
git merge dev
git push -u origin master
4.2 master的提交变动更新到开发分支上
git checkout master
git pull
git checkout dev
git merge master
git push -u origin dev
4.2 git merge撤销
①、如果使用 git merge 操作,但还未 add 时,取消merge命令:
$ git merge --abort
②、如果已经执行git add了,取消merge命令:
步骤 1)
$ git merge --reflog
这将显示所有历史操作记录。
步骤 2)
$ git reset --hard ${COMMIT_ID}
之后即可回退到merge之前的状态。
5、Git提交已修改的代码到新分支
需求背景:
因项目需求优化需要,代码是从origin的dev clone下来的,就直接在本地修改代码,单因为特殊原因不希望dev分支被修改掉:
.
不对dev分支做任何修改(有的项目创建分支时禁止提交修改的代码到主分支上);
将新的代码push到新的分支上去
我们可以这样做:
查看现在所在的分支
git branch
查看本地代码状态
git status
提交当前修改到本地
git add .
git commit -m ‘modify and init in new branch’
push到新的分支:new_dev
git push origin dev:dev_new
切换到新的分支
git checkout dev_new
这时可以去gitlab远程上查看新建的new_dev分支,你修改的代码也已经提交上去啦!
6、Git回退到历史版本
适用场景: 如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用这种方法。
git log
git reset --hard 目标版本号
案例:
回退代码到指定的commitId处(如回退到注释“添加数据源备注”位置):
随后执行:
$ git reset --hard fcc9f69b070f8a0aae9fb853d7db35b3bad9f641
GUI方式(已IDEA工具为例)的Reset回滚操作如下:
7、checkout后关联远程分支
从git上checkout到本地后,在执行git pull拉取远程变动到本地前,需要先与远程分支做关联。
$ git checkout test_new
$ git branch --set-upstream-to=origin/test_new
Branch 'test_new' set up to track remote branch 'test_new' from 'origin'.
第二条命令为本地关联远程分支的命令,如果没有执行,可能会报如下错误:
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.
git pull <remote> <branch>
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream-to=origin/<branch> uat
8、git从已有分支上创建新分支
开发过程中,经常需要用到已有分支上创建新分支的情况,如从master分支copy一个开发分支dev。
那么久可以使用如下命令行完成这个流程:
1)、切换到被copy的分支(master),并且从远端拉取最新版本
$git checkout master
2)、$git pull
从当前分支拉copy开发分支
3)、$git checkout -b dev
Switched to a new branch 'dev'
把新建的分支push到远端
4)、$git push origin dev
拉取远端分支
5)、$git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.
git pull <remote> <branch>
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream-to=origin/<branch> dev
经过验证,当前的分支并没有和本地分支关联,根据提示进行下一步进行本地分支与远程分支的关联映射:
6)、$git branch --set-upstream-to=origin/dev
再次拉取 验证
7)、$git pull
9. error: Your local changes to the following files would be overwritten by merge
9.1 该错误经查发生的场景如:
- 团队其他成员修改了某些文件并已先于你提交入库
- 你在pull之前修改了本地这些文件(或集合中的某个),等你修改完代码再pull时,报错提示出来了
9.2 解决方案
1、 保留修改
执行以下三条命令
#封存你工作区的修改
- git stash
#拉取远程上别人的最新代码
- git pull origin master
#本地修改还原出来
- git stash pop
注:
- git stash:备份当前工作区内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前工作区内容保存到Git栈中
- git pull:拉取服务器上当前分支代码
- git stash pop:从Git栈中读取最近一次保存的内容,恢复工作区相关内容。同时,用户可能进行多次stash操作,需要保证后stash的最先被取到,所以用栈(先进后出)来管理;pop取栈顶的内容并恢复
- git stash list:显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。
- git stash clear:清空Git栈
2 废弃本地修改
核心思想就是版本回退,具体命令如下
- git reset --hard
- git pull origin master
操作请三思:
一般不建议使用第二种, 除非你认定本地修改无需再保存
。
10、git checkout语法
在日常的git操作中,git checkout (检出),是我们的常用命令。最为常用的两种情形是:
- 创建分支
- 切换分支
$ git checkout -h
usage: git checkout [<options>] <branch>
or: git checkout [<options>] [<branch>] -- <file>...
-b <branch> create and checkout a new branch
-B <branch> create/reset and checkout a branch
-l create reflog for new branch
--guess second guess 'git checkout <no-such-branch>' (default)
--overlay use overlay mode (default)
-q, --quiet suppress progress reporting
--recurse-submodules[=<checkout>]
control recursive updating of submodules
--progress force progress reporting
-m, --merge perform a 3-way merge with the new branch
--conflict <style> conflict style (merge or diff3)
-d, --detach detach HEAD at named commit
-t, --track set upstream info for new branch
-f, --force force checkout (throw away local modifications)
--orphan <new-branch>
new unparented branch
--overwrite-ignore update ignored files (default)
--ignore-other-worktrees
do not check if another worktree is holding the given ref
-2, --ours checkout our version for unmerged files
-3, --theirs checkout their version for unmerged files
-p, --patch select hunks interactively
--ignore-skip-worktree-bits
do not limit pathspecs to sparse entries only
--pathspec-from-file <file>
read pathspec from file
--pathspec-file-nul with --pathspec-from-file, pathspec elements are separated with NUL character