赞
踩
工作区: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列表。文件中每一行对应于远程服务器的一个分支。
commitId
svn:1,2,3 … 递增的数字。git:SHA1计算出来的非常大的数字。
Create a new local repository,把当前目录变成Git可以管理的仓库。
在当前目录中产生一个.git的子目录,以后所有的文件变化信息都会保存到这个目录。
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
比较修改文件的内容。
git diff:比较工作区和暂存区
git diff --cached:比较暂存区和本地库
git diff HEAD:比较工作区和本地库
显示最近一次提交的日志消息和文本差异。
–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
#显示某个文件在两次提交纪录间的变更履历,时间,担当
显示从最近到最远的提交日志。
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 -n 5
用于将当前工作区的修改暂存起来,像堆栈一样,可以随时将某一次缓存的修改再重新应用到当前工作区。
git stash list 查看当前stash中的内容;
git stash pop 将当前stash中的内容弹出,应用到当前分支对应的工作目录;
git stash
git pull
git stash pop
# 正常流程提交。git add/ git commit/ git push
查看仓库的状态
1.工作区的修改文件(not git add)
2.需添加到仓库的文件(git add but not git commit)
添加文件到暂存区 :
1.添加文件到暂存区(.git/objects)
2.添加文件索引到index文件(.git/index)
git add readme.c
git add . #将所有修改添加到暂存区
把暂存区的内容提交到版本库
1.git/index #文件保存的目录树创建tree对象
2.git/refs/heads/master #文件保存了这次commit的id
#提交暂存区的文件到仓库区
git commit -m "描述"
#提交暂存区的指定文件到仓库区
git commit [file1] ... -m "描述"
#修改上一次的commit的描述
git commit --amend -m "新的描述"
从当前的工作空间中和索引中删除文件。
git rm –r * #进入某个目录中,执行此语句会删除该目录下的所有文件和子目录
git rm f1 #删除文件f1
给本地库中的文件重命名。
git mv test.h test.h.bak
不用git add,可以直接git commit。
如果远程git服务器仓库分支已经有了更新上,git pull时将会默认执行merge合并提交。相当于执行两个操作:git fetch & git merge
git pull origin master:将origin这个版本库的代码更新到本地的master主支
git fetch 从服务器代码更新到本地,不会自动合并代码
git fetch --all 更新所有分支
git merge 把一个分支合并到当前的分支
把本地未push的分叉提交历史整理成直线。
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
将本地commit的代码更新到远程版本库中
git push origin master 上传本地当前分支代码到master分支
#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
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拉取最新代码。
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
删除分支中未跟踪的文件(untracked files)。
建议加上 -n 参数会显示将要删掉的文件,防止重要文件被误删。
-f 表示文件
-d 表示目录
-x 表示加上.gitignore中的文件
git clean -xfd 删除当前目录不被管理的文件/目录
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 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 分支,代码同步
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 #只显示文件
项目达到一个重要的阶段,需要保存那个特别的提交快照,可以使用 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 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
如果想恢复到之前某个提交的版本,且那个版本之后提交的版本都不要了,可以用git reset
场景1:当改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file
场景2:不但改乱了工作区某个文件的内容,还添加到了暂存区时想丢弃修改 1.用命令git reset HEAD file回到场景1。 2.按场景1操作
场景3:已经提交了不合适的修改到版本库时,没有推送到远程库。想要撤销本次提交使用版本回退。
git reset --hard HEAD^
配置文件,用于配置未入库的文件,不需要加入版本管理的文件。
只能过滤掉本地文件,对已在git仓库中的文件没有影响。
/
开头表示目录*
通配多个字符?
通配单个字符[ ]
包含单个字符的匹配列表!
表示不忽略(跟踪)匹配到的文件或目录fd1/*
忽略目录fd1下的全部内容,根目录下的/fd1/目录或某个子目录/child/fd1/目录/fd1/*
忽略根目录下的/fd1/目录的全部内容!.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
1.git revert用一次新的commit(内容反向修改)来回滚之前的commit,git reset是直接删除指定的commit
2.git reset是把HEAD向后移动了一下,git revert是HEAD继续前进,新的commit内容是上一版本内容
revert的作用创建一个新的版本,这个版本的内容与我们要回退到的目标版本一样,
但是HEAD指针是指向这个新生成的版本,而不是目标版本。假设我们要回退到版本一,版本四的内容和版本一是一样的
git merge & git rebase
refs/for/mybranch 需要经过code review之后才可以提交;
refs/heads/mybranch不需要code review。
git push origin HEAD:refs/for/mybranch
# 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 ./ 递归执行,取消修改与服务器文件保持一致
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。