相对于SVN/CVS/VSS这些集中式,Git 是一个开源的分布式版本控制系统。 git客户端下载 https://www.git-scm.com/download/ git远程仓库gitlab/

基础概念

1.4个空间5种状态 2.本地仓库 3.远程仓库 4.分支 5.标签tag 6.stash

工作流程 image.png

git 最常用的操作 image.png

场景

将本地开发的代码推到远程仓库

准备工作:

  1. 新建远程仓库,得到一个远程仓库地址${url}
  2. 进入项目目录执行以下操作
git init
git add .
git commit -m "一期功能已完成"
git remote add origin ${url}
git push origin master:master

从远程仓库下载代码到本地仓库开发

git remote add origin ${url}
git pull origin ${remoteBranch}
或者(仅针对最后一个操作)
git pull origin ${remoteBranch}:${localBranch}

不指定本地分支则默认合并到当前分支。 开发工作,做各种修改

git add .
git commit -m "二期功能修改完成"
git push origin ${localBranch}:${remoteBranch}

上面例子用到的origin和master,都是可以自定义的名称。 origin类似host alias,master是常见的初始化本地仓库自动生成的分支名称

4个空间5中状态

4个空间

i.工作区(Working Area) ii.暂存区(Stage) iii.本地仓库(Local Repository) iv.远程仓库(Remote Repository) image.png

5种状态

未修改(Origin)

  • 已修改(Modified)&未追踪(Untracked)
  • 已暂存(Staged)
  • 已提交(Committed)
  • 已推送(Pushed) image.png

本地

image.png

文件和仓库

操作

image.png git init 创建本地仓库和工作目录 git add . 把当前目录所有内容添加到暂存区 git commit -m "对本地修改的描述" 暂存区的内容提交到本地仓库 附注:「git add .」中的 . 表示当前目录下的所有内容。若不像全部添加,. 可以替换为文件名,目录名。

查看

git status
git log
git log --pretty=oneline
git log --graph --pretty=oneline --abbrev-commit
git reflog
git ls-files

比较

1)比较工作区 不加任何参数表示比较工作区和暂存区(若stage无则取最近一次提交) git diff a.txt

2)工作区和指定提交版本的比较 比较指定版本的所有改变 git diff ${commit_id}

3)比较指定版本的指定文件 git diff ${commit_id} a.txt

4)比较两个提交版本的区别 git diff ${commit_id1} ${commit_id2} git diff ${commit_id1} ${commit_id2} a.txt

删除

1)从工作区和版本控制里删除 git rm -f a.txt git rm -rf ${directory}

2)仅从版本控制里删除 git rm -f --cached a.txt git rm -rf --cached ${directory}

账户配置

1)配置本仓库的账户 git config "yangchao" git config user.email yangchao@ 2)配置全局的账户 git config --global "yangchao" git config --global user.email yangchao@

3)查看配置 git config -l

撤销回滚

1)从暂存区恢复

add了但没commit,之后又对文件修改,想放弃本次修改,恢复到暂存区的内容。 git checkout a.txt git checkout -- a.txt 执行git checkout a.txt 后,stage内的版本会覆盖掉工作区的内容

2)从本地仓库恢复

i.恢复所有 git reset --hard HEAD 将工作区所有内容置为最近一次提交到本地仓库的版本。

ii.恢复指定文件 git reset --hard HEAD会把当前工作区所有内容都恢复到上一次提交到状态,若只想 恢复指定文件 git checkout HEAD a.txt 语法为 git checkout ${commit_id} a.txt

其中,HEAD是指针,表示本地仓库的最新一次提交的版本。 HEAD^ 表示指针后移一位(次新),HEAD^^表示指针后移2位,即倒数第N+1次提交。

iii.误操作 如果不小心执行了git reset --hard HEAD 此时还有没有救就看被覆盖的数据是在工作区还是暂存区 如果是工作区,抱歉,无药可救 如果是暂存区,git fsck --lost-found 查看被抛弃的文件 到工作目录下的 .git/lost-found/other 目录中寻找已经add过的文件。

远程仓库

绑定、查看与配置

1)查看本地已经添加的本地仓库 git remote -v 2)本地添加远程仓库 git remote add origin ${url} 3)本地删除远程仓库关联 git remote remove origin git remote rm origin

拉取pull/fetch/clone

拉取远程分支 克隆远程仓库到本地仓库 git clone ${url} git pull = git fetch + git merge git pull的完整格式 git pull origin ${remoteBranch}:${localBranch} 若${localBranch}不存在则会自动创建 拉取不相关的仓库 git pull origin master --allow-unrelated-histories

提交push

1)本地仓库推送到远程仓库 提交到远程仓库的分支如果不存在则会被自动创建 git push origin ${localBranch}:${remoteBranch} 2)强制覆盖 git push --force origin ${localBranch}:${remoteBranch} git push -f origin ${localBranch}:${remoteBranch} 强烈不建议!!!

3)指定默认远程主机 git push -u origin master 省略了远程分支。意思是把master分支提交到origin的master分支,并设定默认主机为origin。「之后就可以只用git push」将当前默认分支推送到origin的同名远程分支 当不指定远程分支名称 git push origin ${localBranch} 则会推送到分支名字为${localBranch} 的远程分支,等同于 git push origin ${localBranch}:${localBranch} 新建了名称为${localBranch}的远程分支

删除

远程分支 删除远程分支 2种方法:

  1. 使用--delete git push origin --delete ${remoteBranchName} 被保护的分支不能这么删除。一个空的远程仓库会将首次创建的分支定位被保护的分支和默认分支。被保护分支意味着不能删除。默认分支意味着当提交时不指定分支名称时被推送到的分支。
  2. 从本地推送一个空的分支到要删除的远程分支 git push origin :${remoteBranch2Delete} 推送本地某个分支到远程指定分支语法为 git push origin ${localBranch}:${remoteBranc} 当${localBranch}为空表示推送空的分支到${remoteBranc},这个操作等同于删除了${remoteBranc}

分支

当初始化本地仓库时默认自动创建master本地分支。

查看本地分支

git branch

查看本地关联的远程分支

git branch -r

查看所有分支

本地和已经拉取的远程分支 git branch -a

创建本地分支

git branch ${newBranch}

切换分支

git checkout ${branchName}

创建并切换分支

git checkout -b ${newBranchName} 则会将当前工作区的内容拷贝到新的分区 等同于执行了以下两条:

  1. git branch ${newBranchName}
  2. git checkout ${newBranchName}

合并分支

git merge ${branchName} 作用:把${branchName}合并到当前分支

删除分支

git branch -d ${localBranchName} 附注:${localBranchName}不能是当前分支,否则删除失败 强行删除 git branch -D ${localBranchName}

标签

标签tag跟一次commit类似,区别在于commit_id是一串哈希值,tag名字比commit_id具有可读性。

创建标签

git tag ${tagName} 比如git tag netsign_agent_rbc_v1.0.0 则在当前分支下创建了一个标签名称为netsign_agent_rbc_v1.0.0的标签

查看所有标签

git tag

对某次commit打标签

git tag ${tagName} ${commit_id}

查看标签详细信息

git show ${tagName}

创建带描述的tag

git tag -a ${tagName} -m "description" ${commit_id}

删除标签

git tag -d ${tagName}

本地标签推动到远程仓库

git push origin ${tagName} 推送所有标签 git push origin --tags

stash

正在开发时被迫切换到别的分支,而又不想提交本次的修改,可以先藏起来。stash的作用就是允许先藏本次的修改,不需要提交的前提下切换到别的分支操作。

隐藏内容

git stash

查看隐藏的内容

git stash list

恢复和删除:

git stash apply git stash drop

恢复和删除

git stash pop

附注: .gitignore 文件 在.gitignore 文件中填写不想被追踪的文件或者目录。 默认是提示追踪工作目录下的所有非空目录和文件。