当前位置:   article > 正文

git常用命令_git --depth

git --depth

在这里插入图片描述
工作区:workspace,看到的目录。
暂存区:index(stage),执行git add 工作区的修改保存到暂存区。SVN无暂存区概念。
版本库:Repository
远程库:Remote

./git/index 暂存区(stage)
./git/HEAD 保存当前的branch,默认指向master分支。master是自动创建的第一个分支。
./git/COMMIT_EDITMSG 保存上一次提交时的注释信息
./git/config 项目的配置信息
./git/description 项目的描述信息
./git/info exclude文件:指定本项目要忽略的文件
./git/logs 各个refs的历史信息
./git/objects 存储Git的数据对象。包括:提交(commits), 树对象(trees),二进制对象(blobs),标签对象(tags)
./git/refs 标识每个分支指向哪个提交(commit)
./git/FETCH_HEAD 某个branch在服务器上的最新状态。每一个执行过fetch操作的项目都会存在一个FETCH_HEAD列表。文件中每一行对应于远程服务器的一个分支。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

commitId
svn:1,2,3 … 递增的数字。git:SHA1计算出来的非常大的数字。

git init

Create a new local repository,把当前目录变成Git可以管理的仓库。
在当前目录中产生一个.git的子目录,以后所有的文件变化信息都会保存到这个目录。

git clone

clone an existing repository
参数:
depth=1:深度为1(只有最近一次的提交记录)
branch=master:分支为master

#将远程库test的master分支克隆到目录test
git clone git@gitlab.xxx.com:xxxProduct/test.git --depth=1 --branch=master

#1.将远程库test的master分支克隆到目录Dev
#2.进入Dev目录将远程库test的Res分支克隆到目录res
git clone git@gitlab.xxx.com:xxxProduct/test.git --depth=1 --branch=master ./Dev && \
cd ./Dev && \
git clone git@gitlab.xxx.com:xxxProduct/test.git --depth=1 --branch=Res ./res
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

git diff

比较修改文件的内容。
git diff:比较工作区和暂存区
git diff --cached:比较暂存区和本地库
git diff HEAD:比较工作区和本地库

git show

显示最近一次提交的日志消息和文本差异。
–name-status #显示文件的状态
–name-only #只显示文件
加上commitId显示指定某次的提交日志:git show e921488887a92699537645f29eb8e08fa1d

git rev-parse HEAD #获取最近一次提交的commit id
git diff --name-status + lastCommitId + topCommitId 
#显示两次commit id 之间的提交文件
git show --name-status lastCommitId topCommitId MapDisplaySample.hxx 
#显示某个文件在两次提交纪录间的变更履历,时间,担当
  • 1
  • 2
  • 3
  • 4
  • 5

git log

显示从最近到最远的提交日志。
git log [options] [ …]
-p或 --patch:显示每次提交所引入的差异
–pretty=:使用指定格式显示历史提交信息

git log --pretty=oneline 每一个版本修改显示到一行
git log -p filename 查看某个文件的提交记录以及对此文件的修改
git reflog 纪录所有分支的所有操作记录

git log 显示从最近到最远的提交日志
git show --raw CommitId 查看此次提交的变更文件
git log -p xxx.cpp 查看某个文件的提交记录以及对此文件的修改

git blame

追溯代码的修改历史
git blame
git blame -n 5

git stash

用于将当前工作区的修改暂存起来,像堆栈一样,可以随时将某一次缓存的修改再重新应用到当前工作区。
git stash list 查看当前stash中的内容;
git stash pop 将当前stash中的内容弹出,应用到当前分支对应的工作目录;

git stash
git pull
git stash pop
# 正常流程提交。git add/ git commit/ git push
  • 1
  • 2
  • 3
  • 4

git status

查看仓库的状态
1.工作区的修改文件(not git add)
2.需添加到仓库的文件(git add but not git commit)

git add

添加文件到暂存区 :
1.添加文件到暂存区(.git/objects)
2.添加文件索引到index文件(.git/index)

git add readme.c
git add . #将所有修改添加到暂存区
  • 1
  • 2

git commit

把暂存区的内容提交到版本库

1.git/index #文件保存的目录树创建tree对象
2.git/refs/heads/master #文件保存了这次commit的id

#提交暂存区的文件到仓库区
git commit -m "描述"
#提交暂存区的指定文件到仓库区
git commit [file1] ... -m "描述"
#修改上一次的commit的描述
git commit --amend -m "新的描述"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

git rm

从当前的工作空间中和索引中删除文件。

git rm –r * #进入某个目录中,执行此语句会删除该目录下的所有文件和子目录
git rm f1 #删除文件f1
  • 1
  • 2

git mv

给本地库中的文件重命名。
git mv test.h test.h.bak
不用git add,可以直接git commit。

git pull

如果远程git服务器仓库分支已经有了更新上,git pull时将会默认执行merge合并提交。相当于执行两个操作:git fetch & git merge
git pull origin master:将origin这个版本库的代码更新到本地的master主支

git fetch 从服务器代码更新到本地,不会自动合并代码
git fetch --all 更新所有分支
git merge 把一个分支合并到当前的分支

git rebase

把本地未push的分叉提交历史整理成直线。

git cherry-pick

git clone git@gitlab.xxxxxxx-xxx.com:xxxx/xxx.git
git branch
git branch -a
git checkout -b develop origin/develop
git checkout -b release origin/release

对于多分支的代码库,将代码从一个分支转移到另一个分支是常见需求。
情况1:需要另一个分支的所有代码变动,采用合并(git merge)。
情况2:只需部分代码变动,采用 Cherry pick。
dev分支的一次提交id(commitHash),同步到release分支。

git checkout releaseBranch
git cherry-pick commitHash
  • 1
  • 2

git push

将本地commit的代码更新到远程版本库中
git push origin master 上传本地当前分支代码到master分支

git config

#git库的配置信息
git commit 时提示:please tell me who you are
git config --global user.email "you@example.com"
git config --global user.name "your Name"

#显示当前的Git配置
git config --list(-l)
#账号密码配置完后只需输入一次就存储
git config --global credential.helper store
#下次提交会重新输入账号密码(cmd管理员身份运行)
git config --system --unset credential.helper
#git bash上显示中文
git config --global  core.quotepath false
#LF will be replaced by CRLF的问题
git config core.autocrlf false
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
hint: You have divergent branches and need to specify how to reconcile them.
hint: You can do so by running one of the following commands sometime before
hint: your next pull:
hint: 
hint:   git config pull.rebase false  # merge
hint:   git config pull.rebase true   # rebase
hint:   git config pull.ff only       # fast-forward only
hint: 
hint: You can replace "git config" with "git config --global" to set a default
hint: preference for all repositories. You can also pass --rebase, --no-rebase,
hint: or --ff-only on the command line to override the configured default per
hint: invocation.
fatal: Need to specify how to reconcile divergent branches.

分析:由于拉取pull分支前,进行过merge合并更新分支操作,且其他人在merge之前已经push过一个版本,导致版本不一致。

解决方法:git config pull.rebase false
// git config --global --add pull.rebase false
默认将pull下来的代码与现有改动的代码进行合并。但可能会造成代码冲突需要处理。
或者回退到合并之前的代码,在进行pull拉取最新代码。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

git remote

git上xxx项目的目录:http://gitlab.xxx.com/groups/xxx

#列出存在的远程仓库
git remote #orign

#列出远程仓库详细信息
git remote –v(verbose) #origin http://gitlab.xxx.com/test.git

#添加远程库
git remote add origin git@github.com:michaelliao/learngit.git

#当代码库远程迁移后,修改本地代码关联的远程地址
git remote set-url origin git@gitlab.xxx.com:xxx/test.git
git remote set-url origin http://gitlab.xxx.com/xxx/test.git
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

git clean

删除分支中未跟踪的文件(untracked files)。
建议加上 -n 参数会显示将要删掉的文件,防止重要文件被误删。
-f 表示文件
-d 表示目录
-x 表示加上.gitignore中的文件
git clean -xfd 删除当前目录不被管理的文件/目录

git checkout

git checkout a 恢复暂存区的指定文件到工作区(删除本地一个文件a并把仓库上最新的a更新下来)
git checkout – ./ 丢弃工作区的修改(代码修改了之后add之前)
git checkout . 恢复暂存区的所有文件到工作区

误删除文件从版本库恢复:
版本库里有文件b.txt,如要删除b.txt:执行rm b.txt后工作区没有此文件,此时有两种操作
1.直接commit版本库就可以删除b.txt
2.文件被误删了,可以从版本库恢复被删的b.txt:git checkout – b.txt

git branch

git branch 列出可用的分支
git checkout master 切换到master分支
git branch branch1 创建分支branch1
git checkout -b branch1 创建新的分支并切换到新的分支
git branch -d branch1 删除分支

#使用master分支
git clone git@gitlab.xxx.com:xxx/xxx.git --branch=master #不能指定深度信息
git checkout dev #切换到dev分支,代码同步
git checkout release #切换到release 分支,代码同步
  • 1
  • 2
  • 3
  • 4
git rev-parse HEAD 获取最近一次提交的commit id
git diff --name-status + lastCommitId + ' ' + topCommitId #显示两次commit id 之间的提交文件
git show --name-status d405d... a78ff... test.h #查看某文件在两次提交纪录间的变更履历/时间/担当
--name-status #显示文件的状态
--name-only #只显示文件
  • 1
  • 2
  • 3
  • 4
  • 5

git tag

项目达到一个重要的阶段,需要保存那个特别的提交快照,可以使用 git tag 打上标签。
-a 创建一个带注解的标签
-d 删除标签

git tag #查看所有标签
git show v1.0 #查看tag内容
git tag v1.0 / git tag -a v1.0 #给最新一次提交打上"v1.0"的标签
git tag -a v1.0 -m “标签注解注解” #提交带注解的标签
git tag -a v0.9 85fc7e7 #给"85fc7e7"提交打上"v1.0"的标签
git push origin v1.0 #推送到远程仓库
git push origin --tags #推送所有的本地标签

git tag -d v1.0 #删除标签"v1.0"
git push origin :refs/tags/v1.0 #推送远程删除记录

版本回退

git reset

#git add的撤销:
git reset HEAD #撤销上次add的全部文件
git reset HEAD test.c #撤销上次add的test.c文件

#撤销commit,保留add:
git reset --soft HEAD^

#撤销commit,也撤销add (删除工作区的修改代码):
git reset --hard HEAD^ #回退到上一个版本
git reset --hard HEAD~100 #回退到前100个版本
#HEAD指当前版本,^指上一个版本。回退到上个版本之后,用git log查看最新一次的记录没有了。

#通过git reflog可以看到每次记录的版本号(包含回退之前的那次)
git reset --hard 6fcfc89 #回退到版本6fcfc89

如果本地和远程同时修改了文件,pull时会有冲突,如果不需要保存问题的修改,直接还原本地即可。
git reset --hard FETCH_HEAD
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

如果想恢复到之前某个提交的版本,且那个版本之后提交的版本都不要了,可以用git reset
reset
场景1:当改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file
场景2:不但改乱了工作区某个文件的内容,还添加到了暂存区时想丢弃修改 1.用命令git reset HEAD file回到场景1。 2.按场景1操作
场景3:已经提交了不合适的修改到版本库时,没有推送到远程库。想要撤销本次提交使用版本回退。
git reset --hard HEAD^

gitignore

配置文件,用于配置未入库的文件,不需要加入版本管理的文件。
只能过滤掉本地文件,对已在git仓库中的文件没有影响。

  1. 配置语法:
    斜杠/开头表示目录
    星号*通配多个字符
    问号?通配单个字符
    方括号[ ]包含单个字符的匹配列表
    叹号!表示不忽略(跟踪)匹配到的文件或目录
    git对ignore配置文件是按行从上到下进行规则匹配,如果前面的规则匹配的范围更大后面的规不会生效
  2. 示例:
    规则1:fd1/* 忽略目录fd1下的全部内容,根目录下的/fd1/目录或某个子目录/child/fd1/目录
    规则2:/fd1/* 忽略根目录下的/fd1/目录的全部内容
    规则3:
    !.gitignore
    !/fw/bin/
    !/fw/sf/
    忽略全部内容,但是不忽略.gitignore文件、根目录下的/fw/bin/和/fw/sf/目录

对于已入库的文件,取消状态跟踪:
忽略文件的修改,git status 不会显示忽略文件的变化。
git update-index --assume-unchanged ConsoleApplication3.pdb

取消忽略的文件,恢复正常。
git update-index --no-assume-unchanged

git update-index --skip-worktree

git revert

1.git revert用一次新的commit(内容反向修改)来回滚之前的commit,git reset是直接删除指定的commit
2.git reset是把HEAD向后移动了一下,git revert是HEAD继续前进,新的commit内容是上一版本内容

revert的作用创建一个新的版本,这个版本的内容与我们要回退到的目标版本一样,
但是HEAD指针是指向这个新生成的版本,而不是目标版本。假设我们要回退到版本一,版本四的内容和版本一是一样的

在这里插入图片描述
git merge & git rebase
git

code review

refs/for/mybranch 需要经过code review之后才可以提交;
refs/heads/mybranch不需要code review。
git push origin HEAD:refs/for/mybranch

SVN

# sudo apt-get install subversion
创建版本库
# sudo mkdir /home/svn
# sudo svnadmin create /home/svn/repos

1.从服务器下载代码到本地
svn checkout http://svn.autonavi.xxx-inc.com/repos/xxx
2.往版本库中添加删除文件
添加:svn add filename
删除:svn delete filename
3.提交
svn commit -m "注释" test.cpp
4.比较单一文件和服务器上的不同
svn diff register.c
5.显示日志
svn log filename
6.更新
svn update 更新当前目录以及子目录下的所有文件到最新版本
7.加锁
svn lock m "注释说明" filename
8.获取当前最新版本号
svnlook youngest /home/svn/repos
9.svn revert -R ./   递归执行,取消修改与服务器文件保持一致
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/405100
推荐阅读
相关标签
  

闽ICP备14008679号