1、查看本地git add ./指令后查看暂缓区里的文件内容(如果没进行commit操作,这个add会把新旧文件一起放到暂缓区,如果在add后本地删除了某个文件,再进行add,其暂缓区会保留有这个文件的(这个暂缓区是放到.git文件夹下的,下面强制恢复版本的会修改这里的暂缓区,使其存储的是当前版本具有的文件):
git ls-files
查看指令,其可以查看本地的代码仓库情况,包括新文件、未提交comit等、跟远程代码仓库差了几个版本:
git status
例如比远程仓库少一个层级如下:
使用git log查看是否是如此
2、如果通过add添加了一些不需要的文件,删除他的指令是:
git rm --cached build/darknet/data/resnet50_iter_7000.caffemodel
特点:其不删除物理文件。例子:
例如使用未使用指令时,添加多了一个模型文件,导致其整体文件很大。如下:
然而不想回滚到上次提交,则使用这个rm指令,然后如下:
如果添错太多东西,则可以直接回滚到上次提交,即会重置缓存区,把其重置成使用add指令前的状态。可以使用指令(不带任何参数,其默认时(--mixed)):
git reset
第二个指令;如果使用(慎用):
git rm --f "文件路径"
特点:这个不仅会从缓存中删除,还会删除物理文件(不会垃圾桶回收)。
3、关于回退版本的操作(其不会改变.git文件夹的大小,如果误操作导致.git很大,其也无能无力,只能使用git clone来解决):
暂存区是属于add后并进行commit后会把需要提交的数据路径放到一个暂存区(是相当于一个拷贝),此时可以手动删除工程目录下的实体文件。如下手动删除文件后如下:
$ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: a.txt
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: a.txt
git reset (–mixed) HEAD~1
(-mixed是默认参数)回退一个版本,且会将暂存区的内容和本地已提交的内容全部恢复到未暂存的状态,不影响原来本地文件(未提交的也 不受影响,即新建了一个文件,此时回退到新建前的版本,不会删除这个文件)
git reset –soft HEAD~1 (其不会覆盖本地的代码,)
回退一个版本,不清空暂存区,将已提交的内容恢复到暂存区,不影响原来本地的文件(未提交的也不受影响)
git reset –hard HEAD~1 (慎用,假如本地代码的一些未提交的修改是不要的,就可以用,其主要是把本地代码全部换成指的log的代码)
用 git log -g 查看所有的提交版本。
回退一个版本,清空暂存区,将已提交的内容的版本恢复到本地,本地的文件也将被恢复的版本替换,即本地的代码会改变为对应版本的代码。(此时.git文件大小不会变小,还是一样大,不知道为啥,猜测是相当于有个垃圾回收站的功能。解决方法就是git clone远程仓库的代码到本地并使用哪里的.git文件)此时使用git ls-files 显示的代码是当前版本的拥有的文件内容。
其中回退版本有两种情况下:
第一种:是本地进行commit 后,还没有push到远程仓库,此时想撤销此次提交。其步骤为:
$ git log
commit a44822002522f2ab1e3a5e2a1cec00a7d3d02185 (HEAD -> master, origin/master, origin/HEAD)
Author: hanchao5272 <89298141@qq.com>
Date: Sun Mar 4 11:14:55 2018 +0800
优快云-java反射06-成员变量Field-代码优化
commit aa909cff2239536df14820fe086d96305b24e9f1
Author: hanchao5272 <89298141@qq.com>
Date: Sat Mar 3 23:43:03 2018 +0800
优快云-java反射-修饰符-代码优化
只有git log查看本地仓库里记录的历史提交,包括最近为push的提交。此时使用git reset --soft即可回退到对应版本如下:
git reset --soft aa909cff2239536df14820fe086d96305b24e9f1
此时通过,git log即可看到提交历史记录里没有了最新的一次提交。
第二种:是本地进行commit后,已经提交到远程仓库,此时想把远程仓库回滚到先前的某次提交(其实没必要回滚):
按照上面的第一种的方法先把本地回滚到想要的版本,然后再通过push进行提交,此时会出错由于本都版本过旧导致提交失败的错误。此时要再push后面添加一个参数就是【-f】。
例如原先远程仓库的提交数如下:
进行本地强制push指令:
git push https://gitee.com/用户名/test_reset.git -f
后变为如下:
此时就可以把远程仓库回滚到指定版本。
3、如果代码工程有分支,则如果想查看当前工程具有的分支。可以使用:
参考博客:Git-命令行-删除本地和远程分支_段浅浅的博客-优快云博客_git删除分支命令
创建新分支:
git branch test
查看本地仓库有的分支:
git branch
切换分支:
git checkout master
删除分支(git位于的当前分支是无法删除的,需要切换到其它分支才可以,其删除的是本地分支,不会影响到远程分支):
git branch -d xxxxx
删除远程分支(其对主分支是不会有影响的):
git push origin --delete <BranchName>
查看删除后分支:
git branch -a
- c、本地创建新分支并进行提交到远程仓库:
创建新分支,并切换到新分支的指令:
git checkout -b laobandianqi
然后要先进行分支推送,其会在远程仓库里创建一个分支。否则后面进行代码commit时会报错,其推送指令为:
$ git push origin laobandianqi
然后就可以进行代码add、commit等操作指令了。
4、如果远程克隆指定分支的代码(两种方法):
参考博客:使用git克隆指定分支的代码 - ButterflyGirl - 博客园
切换到v2.8.1这个分支就可以看到具体的代码了,如下图所示:
第一种:使用Git下载指定分支命令为:git clone -b 分支名仓库地址
如下图所示:
第二种:先直接克隆整个工程到本地(会包含所有的分支),使用git branch -a 显示不了本地的其它分支,例如:
$ git clone http://gitlab.com/algorithm/fod-recognize-train.git
$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/dev
remotes/origin/master
remotes/origin/new_fod_project
此时可以直接切到指定分支,例如:
git checkout new_fod_project
- b、如果下载的的时候提示问题:
$ git clone -b Interface_2.0 --depth=1 https://gitee.com/yang/partcnn.git
Cloning into 'partcnn'...
fatal: '$GIT_DIR' too big
则是由于当前克隆到本地的文件目录太长了,所有换过另一个文件夹下进行克隆即可。
- c、如果克隆的时候出现了中断,如下:
其则是由于克隆的太多导致的,此时可以设【--depth】参数来只克隆最新的一次提交,丢弃先前的提交信息,这个可以大大减小文件大小。上面的b指令就是克隆Interface2.0分支里的最新一次提交。即用git log查看的结果是只有一次最新的提交信息。
5、如果本地分支被误删除后,如何恢复,其恢复步骤如下:
参考博客:git 误删分支恢复方法_傲雪星枫-优快云博客_误删的git分支怎么恢复
a.使用git log -g 找回之前提交的commit
commit 3eac14d05bc1264cda54a7c21f04c3892f32406a
Reflog: HEAD@{1} (fdipzone <fdipzone@sina.com>)
Reflog message: commit: add test.txt
Author: fdipzone <fdipzone@sina.com>
Date: Sun Jan 31 22:26:33 2016 +0800
add test.txt
b.使用git branch recover_branch[新分支] commit_id命令用这个commit创建一个分支
git branch recover_branch_abc 3eac14d05bc1264cda54a7c21f04c3892f32406a
git branch -a
* develop
recover_branch_abc
remotes/origin-dev/develop
c.切换到recover_branch_abc分支,检查文件是否存在
git checkout recover_branch_abc
Switched to branch 'recover_branch_abc'
ls -lt
total 8
-rw-r--r-- 1 fdipzone staff 4 1 31 22:38 test.txt
这样就可以恢复被误删的分支了,这样子本地的代码就会变成对应commit版本的代码,所以如果代码刚好有修改的,要注意备份好来。再进行恢复。
6、git创建分支的简单用途:
参考博客:git进阶之分支的简单用途_flyinbed_的博客-优快云博客_git分支作用
7、本地重新获得远程代码和远程所有的分支:
- a、首先:
通过git clone先克隆远程仓库代码到本地。此时如果没有看到.git文件夹一般是因为其为隐藏文件而看不到。
- b、通过下面的指令进行把远程仓库里的分支都克隆到本地(亲测,不知道要什么时候生效,推荐不用):
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
第一种情形:推荐的方法是使用下面来拉取远程主机里的分支(git pull是拉取所有的分支到本地仓库):
git pull origin dev
然后就可以直接进行git checkout dev,本地就会自己创建dev分支跟把其自动跟踪远程分支。如下:
第二种情形:在本地创建了一个分支,而远程也存在分支,但他们没有关联起来,而且本地还不存在远程主机的分支,此时关联他们的方法就是:
git pull origin dev
git branch dev
git push --set-upstream origin dev #第一种 关联远程主机并且进行push操作
#接着就可以在本地新建分支并于远程分支关联git branch –set-upstream 本地新建分支名 origin/远程分支名
git branch --set-upstream master origin/master #第二种关联
第三种情形:本地有一个工程,并且没有.git文件,此时想添加个git文件。
此时分两个情况:本地有跟远程仓库里文件相同名称文件被修改;跟远程仓库相同文件没有文件被修改。
如果相同文件没有被修改,只是有添加,则方法跟上面第三种情况差不多,流程为:
git init
#否则会报删除本地文件,在进行融合
git git add ./
#拉取远程仓库所有分支到本地
git pull
#添加origin对象
git remote add origin http://gitlab.pktec.com/algorithm/fod-recognize
#切换分支,并绑定了远程分支dev。
git checkout dev
如果有相同文件被修改,则进行git checkout dev的时候回报错:
error: Your local changes to the following files would be overwritten by checkout:
apps/manage.py
Please commit your changes or stash them before you switch branches.
Aborting
此时的解决方法,要么把此文件刪除了后進行切換分支。
- c、通过下面的指令查看当前本地仓库里的所有分支:
git branch -a
- d、通过下面指令进行项目融合:
git fetch --all
- c、通过下面的指令进行分支切换:
git checkout -b NewInterface_2.0 origin/NewInterface_2.0
8、本地分支关联远程分支并且在本地添加远程仓库:
如果本地代码想提交到远程仓库,最好的做法是先在远程新建好仓库(另一种做法是在本地新建好仓库然后提交到远程),
一般在新建完后远程仓库也会有提示提交代码的一些指令。
对于新的工程进行提交就是(可能有误用不了):
#初始化一个.git文件夹
$git init
#关联远程仓库
$git remote add origin git@github.com:YotrolZ/helloTest.git
#查看本地的关联有的远程仓库地址
$git remote -v
origin git@github.com:YotrolZ/helloTest.git (fetch)
origin git@github.com:YotrolZ/helloTest.git (push)
test git@github.com:YotrolZ/helloTest.git (fetch)
test git@github.com:YotrolZ/helloTest.git (push)
#删除本地存储的某个远程仓库地址
$git reomte remove test
#接着就可以在本地新建分支并于远程分支关联git branch –set-upstream 本地新建分支名 origin/远程分支名
$git branch --set-upstream master origin/master
#最后就可以使用add commit push等进行代码的提交了
对新工程(没有init文件夹)的,但是远程仓库也只有master,还没有【test4】分支:
#1.本地创建一个【.git】文件夹
git init
#2.把远程仓库代码地址添加到本地
git remote add origin https://gitee.com/yang/test_merge.git
#3.本地创建一个分支并切换到对应的分支上,如果是master的话就不用动
git checkout -b test4
#4.进行一次add、commit操作
git add ./
git commit -m "第一次提交"
#5.进行把本地分支推送到远程分支,并且关联,格式为:远程仓库 本地仓库
git push --set-upstream origin/test4 test4
【2】很重要:
如果没有这步操作的话,其【.git/config】文件里的内容大概为:
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
如果添加后的地址为:
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
[remote "origin"]
url = https://gitee.com/yang/test_merge.git
fetch = +refs/heads/*:refs/remotes/origin/*
【4】也很重要,如果没有进行comit的话,则其会报:
yang@DESKTOP-VSM4L53 MINGW64 /f/test_branch/test_merge (test4)
$ git push --set-upstream origin test4
error: src refspec test4 does not match any
error: failed to push some refs to 'https://gitee.com/yang/test_merge.git'
即没有东西提交到远程仓库
【5】重要,其是关联本地仓库跟远程仓库。
这样子远程仓库就有了这个分支,如果电脑没有存储过远程仓库的一些账号信息,则中途可能还会报,输入仓库的用户名邮箱信息如下:
$ git config --global user.name "输入你的用户名"
$ git config --global user.email "输入你的邮箱"
这里的邮箱跟用户名输错了好像也不影响各种git操作(亲测过)。如果像修改的话,其指令为:
$ git config --global --replace-all user.email "输入你的邮箱"
$ git config --global --replace-all user.name "输入你的用户名"
9、代码的pull融合、解决冲突
对于团队合作开发的项目,其就可能涉及到一个代码 融合拉取出现冲突的情况。一般这种情况是要尽量避免的,因为如果出现大量的代码融合则会增加工作量。一帮团队开发的时候是分配好工作的。
注意:其中如果代码改代码的时候没有修改同一行的代码的话,即出现两个程序员修改了同一行时则git pull的时候会显示失败,此时应当先add、commit后再进行一次git pull并且使用git status 可以查看到冲突的文件时那些,然后我们在pycharm打开对于的文件,则其会把冲突的位置用特殊的语句标记,开始的指令顺序为:
git add ./
git commit -m "first commit"
git pull origin
git status
此时输出的提示信息如下:
$ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 2 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: .idea/workspace.xml
both modified: utils/detection_roi.py
no changes added to commit (use "git add" and/or "git commit -a")
在我们点击utils/detection_roi.py代码后提示我们去修改如下:
此时结合实际情况把其修改为适合的代码即可。
然后再进行一次下面的顺序即可成功提交:
git add ./
git commit -m "merge"
git push origin
其中如果不想进行代码融合了,可以使用下面的指令来进行退出融合:
git merge --abort
10、ignore生效条件:
主要使用git ls-files指令,如果这个指令显示的文件里已存在有.ignore的排出的文件则添加的排除格式不会排除旧的文件,会排除以后通过add新添加的指定格式的文件(即对旧的不起作用,只对新的其作用)
git ls-files通过add刚添加的文件跟本版本仓库里具有的文件。如果要排除已经在这里显示的文件,则要进行版本回退到一个不包含此文件的版本,直接使用上面的软版本回退法即可。
11. 别人仓库代码提交到自己新仓库:
由于别人的代码仓库里有.git文件,其存有他对代码的修改历史,对自己也是有好处的。
a.自己新建一个仓库,不要包含readme,ignore等文件。
b.让后在git clone别人的仓库到本地后,修改其远程仓库地址,指令如下:
$vim .git/config
然后只修改url即可:
1 [core]
2 repositoryformatversion = 0
3 filemode = false
4 bare = false
5 logallrefupdates = true
6 symlinks = false
7 ignorecase = true
8 [remote "origin"]
9 url = https://gitee.com/you_name/project_name.git #只需修改这个
10 fetch = +refs/heads/*:refs/remotes/origin/*
11 [branch "master"]
12 remote = origin
13 merge = refs/heads/master
最后,直接进行git push即可。
12、添加tag,管理版本:
參考博客:Git给项目打tag命令
tag就是发布的代码版本,其必须在master分支上进行发布的。
其中要把本地的tag完全添加到代码仓库,使用的指令为:
git push origin --tags
13、如果本地分支跟远程分支要进行有错位,如何同步:
先删除远程分支:
git branch -r -d origin/branch-name
进行清除本地remote的origin分支信息:
清除前:
清除后:
进行本地跟远程分支同步:
git push --set-upstream origin branch_name
完成。
14、git清除本地已经删除的分支信息,例如带了remotes的:
使用指令:
git remote prune origin
原先的info:
prune后的结果: