一、创建版本库
-
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 几个高级用法