git使用指南

706 阅读11分钟

一、创建版本库

  • mkdir <文件夹名> 创建新的文件夹

    如果你使用Windows系统,为了避免遇到各种莫名其妙的问题,请确保目录名<包括父目录>不包含中文。

  • cd <文件夹名> 切换到新的文件夹

  • echo "……" > <文件名> 新建文件并向其中加入内入省略号部分的内容

  • pwd 查看当前目录

  • git init 把当前目录变成git可以管理的仓库

  • git add <文件名> 使用命令git add

    注意,可反复多次使用,添加多个文件,把文件加入暂存区;

  • git commit -m <提示文字> git commit 提交的是一个某个时段的快照,把暂存区的所有修改提交到当前分支。

  • git status 要随时掌握工作区的状态,使用git status命令。

  • git diff 如果git status告诉你有文件被修改过,用git diff可以查看修改内容。

二、版本回退

  • git reset --hard commit_id HEAD指向的版本就是当前版本。Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。

  • git log 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。(在bash里输入wq退出log状态)

  • git reflog 要重返未来,用git reflog(已经删除的提交也可以查看)查看命令历史,以便确定要回到未来的哪个版本。

  • git log --pretty=oneline 只显示第一行(注意:没有git log --pretty=twoline)

  • git reset --hard HEAD^ 回退到上一个版本,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

  • cat readme.txt 查看文件readme.txt的内容

三、工作区、暂存区和版本库

工作区、暂存区、本地仓库和远端仓库的关系,来一图,胜千言。

工作区(Working Directory)

就是你在电脑里能看到的目录文件夹。

版本库(Repository)

工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

Git是跟踪的修改,每次修改,如果不用git add到暂存区,那就不会加入到commit中。

  • git diff HEAD -- <文件名> git diff HEAD -- readme.txt命令可以查看工作区和版本库里面最新版本的区别。

四、撤销修改

此时有两个种情况: 一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态; 一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。 总之,就是让这个文件回到最近一次git commit或git add时的状态。

  • git checkout -- <文件名> 命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销。 若想撤销工作区中所有文件的修改,则可以用 git checkout . 来让文件回到最近一次该文件git commit或git add时的状态。

    一定要加上 --- ,否则就是切换到另一个分支

  • git reset HEAD <文件名> 把暂存区的修改撤销掉(unstage),重新放回工作区。

  • git reset --soft HEAD^ 把已经commit -m '注释' 的内容撤销,add的内容还在

  • git reset --hard HEAD^ 删除工作空间改动代码,撤销commit,撤销git add . 注意完成这个操作后,就恢复到了上一次的commit状态。

  • git commit --amend 如果commit注释写错了,只是想改一下注释,只需要这样,此时会进入默认vim编辑器,键入:i,进入输入模式,用键盘上的上下左右键可以控制方向,到要修改的地方,修改完后按ESC退出编辑模式,再键入:wq回车退出并保存修改。修改了注释后提交的id也会变。

    git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。

五、删除文件

  • git rm 用于删除一个文件。删除工作区的文件,我们可以手动删除文件或是用命令 rm <文件名>。

    当删除了一个工作区的文件后,我们查看状态,发现有两个选择。 一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit。 另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本。 使用命令git checkout -- <文件名>

  • 要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git

  • git push origin 表示,将当前分支推送到origin主机的对应分支。如果当前分支只有一个追踪分支,那么主机名都可以省略。

  • git push 如果当前分支与多个主机存在追踪关系,那么这个时候-u选项会指定一个默认主机,这样后面就可以不加任何参数使用git push。

  • git push -u origin master将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了。

  • 不带任何参数的git push,默认只推送当前分支,这叫做simple方式。此外,还有一种matching方式,会推送所有有对应的远程分支的本地分支。Git2.0版本之前,默认采用matching方法,现在改为默认采用simple方式。

  • 此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改。

六、创建与合并分支

  • 查看分支:git branch
  • 查看本地分支:git branch
  • 查看所有分支:git branch -a
  • 查看远程分支:git branch -r
  • 查看本地分支与远程分支关联关系:git branch -vv
  • 创建分支:git branch 分支名
  • 切换分支:git checkout 分支名
  • 创建+切换分支:git checkout -b 分支名
  • 拉取远程分支并创建本地分支: git checkout -b 本地分支branch_x origin/远程分支名name
  • 合并某分支到当前分支:在当前分支git merge 分支名
  • 删除分支:git branch -d 分支名
  • 以master为源创建分支dev: 先进入master分支,然后,git checkout -b dev
  • 将本地dev分支作为远程dev分支:git push origin dev
  • 删除远程dev分支:git push origin :dev
  • 删除远程分支:(A:分支名,用本地分支名,前面不加origin)git push origin -d A
  • 提交本地dev分支作为远程的master分支:git push origin dev:master
  • 提交本地test分支作为远程的test分支:git push origin test:test
  • 使用git命令操作修改本地分支名称: git branch -m oldBranchName newBranchName
  • 使用git命令操作修改远程分支名称: git push origin :oldBranchName(先删除原来的远端分支) 然后将改名后的本地分支推送到远程,git push --set-upstream origin newBranchName(并将本地分支与之关联)
  • 用某一分支代码完全覆盖另一分支:先切换到目标分支(git checkout test),再设置本地test分支代码的远程为dev分支(git reset --hard origin/dev),本地代码已覆盖,强制推送本地分支到远端(git push -f)

七、解决冲突

当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。 解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。 用git log --graph命令可以看到分支合并图。用git log --oneline --graph命令可以看到简略的分支合并图。

八、分支管理策略

合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

九、Bug分支管理

修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除; 当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。(恢复有两个办法:一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;另一种方式是用git stash pop,恢复的同时把stash内容也删了)

  • git branch -D <分支名> 强制丢弃一个没有被合并过的分支(在dev开发时,需要开发新任务,就在dev上建了新的分支aa,开发完commit了,切回dev后还没来得及合并,此时需求有变,需要删除分支aa,就可用-D强制删除)

十、多人协作

  • git remote –v 查看远程库信息

  • git clone -b branch-name project-url 基于某个分支拉取代码

  • git clone --depth=1 -b branch-name --single-branch project-branch-url branch-name 仅拉取某个路径某个分支下的代码

  • git push origin branch-name 本地新建的分支如果不推送到远程,对其他人就是不可见的;从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;

  • git pull 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

  • git checkout -b branch-name origin/branch-name 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;

  • git branch --set-upstream branch-name origin/branch-name 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;

    多人协作的工作模式通常是这样:

    首先,可以试图用git push origin <分支名>推送自己的修改; 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并; 如果合并有冲突,则解决冲突,并在本地提交; 没有冲突或者解决掉冲突后,再用git push origin <分支名>推送就能成功! 如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <分支名> origin/<分支名>。

  • git cherry-pick <提交id>  选择某一个分支中的一个或几个commit(s)来进行操作(操作的对象是commit),如将A分支中的某一个或是几个commit合并到B分支中,我们先git log (--pretty=oneline) 查看提交ID。如果是要将A分支的commit76cada ~62ecb3 到合并到B分支,那么使用rebase 更合适。首先需要基于A创建一个新的分支,并指明新分支的最后一个commit,用git checkout -b newbranch 62ecb3,然后rebase这个新分支的commit到B(--ontoB),76cada^ 指明你想从哪个特定的commit开始,用git rebase --onto B 76cada^,得到的结果就是A分支的commit 76cada ~62ecb3 都被合并到了B分支。

  • 项目迁移后,地址修改了怎么同步修改git中的配置。git remote查看所有远端仓库,如果输出的是origin,git remote xxx是查看指定远端仓库,git remote set-url origin xxxxxx,origin是上一步的输出,xxxxxxx是新地址。

十一、标签管理

创建标签
  • git tag <标签名 | commit_id> 用于创建一个标签, 默认为HEAD.
  • git tag v<版本号> commit_id 用于创建一个以某个commit点为截止点的版本
  • git tag 查看所有标签
  • git show v<版本号> 查看某个版本下的说明文字
  • git tag –a <标签名> -m “提示描述” 为当前分支的提交记录打上附注标签
  • git tag –a <标签名> -m “提示描述” commit_id 创建某个版本并指定标签信息
  • git tag -n 显示标签的列表和注解
  • git tag -d <标签名> 删除某一标签
  • git log --decorate 可以显示包含标签资料的历史记录
操作标签:
  • git push origin <标签名> 可以推送一个本地标签;
  • git push origin –tags 可以推送全部未推送过的本地标签到远程;
  • git tag -d <标签名> 可以删除一个本地标签;
  • git push origin :refs/tags/<标签名> 可以删除一个远程标签。

十二、忽略特殊文件

忽略某些文件时,需要编写.gitignore; .gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理。

十三、配置别名

  • git config --global alias.co checkout 配置checkout的别名为co

  • git config --global alias.ci commit 配置commit的别名为ci

  • git config --global alias.br branch 配置branch的别名为br

--global参数是全局参数

  • git ci -m "bala bala bala..." 以某一个别名来做相应的操作

  • git config --global alias.unstage 'reset HEAD' 配置撤销修改的别名为unstage

  • git config --global alias.last 'log -1' 配置显示最后一次提交的别名为last

  • cat .git/config 查看git配置文件中的配置,别名在[alias]中

    ---------------------此总结参考廖雪峰的git教程---------------------

1. 廖雪峰Git教程

2. Git常用命令

3. git 几个高级用法