Git 用法举例


一般PhpStrom集合了Git,用的惯了,git命令行语法反而生疏了,所以应该记录一下,以备学习。


正文

一般的开发流程是:从master拉取dev测试分支、pre预发布分支,再从master新拉版本分支ver1.0,从ver1.0拉取自己的开发分支dashi_0514, 然后在自己的分支dashi_0514开发,提交到自己的远程分支dashi_0514,拉取远程项目分支ver1.0,提交合并到自己的远程分支dashi_0514, 再把自己的修改提交到远程版本分支ver1.0,切换到dev分支,拉取dev变动,再拉取ver1.0变动,提交到远程dev分支。如此循环。 直到测试无问题,再切到pre预发布分支,拉取远程ver1.0分支,然后推送到远程pre分支,测试预发布,持续修订到无问题。 该版本开发结束,master拉取合并ver1.0分支,并推送到远程master分支,删除自己的开发分支dashi_0514, 删除版本分支ver1.0(也可以保留封版),dev、pre保留继续作后续版本开发的测试、预发布分支。结束。准备下个版本ver2.0的开发。

git clone 分支地址 (自己可命名本地项目名)

如:

git clone https://github.com/lang/test.git lianxi

查看所有分支:

git branch -a

创建dev新分支:

git branch dev

切换到dev分支:

git checkout dev

或者这样创建新分支并切换过去:

git checkout -b dev

推送本地dev分支更新到远程dev分

git push origin dev:dev

也可以不用指定远程分支名,git会自动补齐

git push origin dev

新建分支并推送到远程:

git checkout master

git checkout -b ver1.0

git push origin ver1.0

git checkout -b dashi_0514

git push origin dashi_0514

查看远程分支情况:

git remote show origin

自己本地分支开发并提交到自己的开发远程分支

git add .

git commit -m “修改”

git push -u origin dashi_0514

第一次用-u自动绑定,以后 只要git push就可以

git push origin dashi_0514

也可以用git branch -u dashi_0514:dashi 把本地 dashi_0514 分支绑定到远程 dashi 分支,以后就可以直接使用git pullgit push

git branch -u dashi_0514:dashi

从远程版本分支ver1.0拉取最新代码到自己本地开发分支dashi_0514

git pull origin ver1.0:dashi_0514

版本分支的变动推送到自己远程分支

git push origin dashi_0514

自己本地分支的变动推送到版本远程分支

git push origin dashi_0514:ver1.0

( 最好合并操作:)

git checkout ver1.0

git merge dashi_0514

git push origin ver1.0

在本地dev分支拉取远程master分支变动:

git pull origin master:dev

可能会有提示:

! [rejected]        master     -> dev  (non-fast-forward)

这种情况下可以用git merge合并远程分支到本地所在分支

git merge origin/master

在本地ver1.0合并远程master分支变动:

git checkout ver1.0

git pull origin master:ver1.0

推送到远程ver1.0分支

git push origin ver1.0

在本地dashi_0514合并远程ver1.0分支

git checkout dashi_0514

git merge origin/ver1.0

推送到远程dashi_0514分支

git push origin dashi_0514

切换到本地dev分支

git checkout dev

拉取dev远程分支最新代码

git pull origin dev

拉取版本远程分支到本地dev分支

git pull origin ver1.0:dev

(最好合并 git merge origin/ver1.0

本地dev再推送到远程dev分支

git push origin dev

如此循环反复开发,直至这个版本的开发任务结束, 合并到master

git checkout master

git merge origin/ver1.0

git push origin master

git fetch 细细对比研究

然后删除相关分支

删除自己的本地分支

git branch -d dashi_0514

删除自己的远程分支

git push origin --delete dashi_0514

打版本标签:

// 查看有哪些版本
git tag

// 显示所有标签,并显示其标签注释
git tag -l -n

// 添加版本标签
git tag -a 1.0.6 -m "注释信息" 

// 将本地所有tags提交到远程仓库中
git push --tags 

注意事项

里面注意区分各分支的协同:

master只作为项目主干分支,目的是站点正式构建的基础。不接受其他各分支的推送,只拉取成熟版本分支的代码。

git checkout master

git pull origin ver1.0:master (或者 git merge origin/ver1.0)

git push origin master

dev作为项目测试分支,目的是测试环境构建的基础。因为可能有多个版本在多个小组手中同时开发, 所以本地dev分支只拉取各版本分支变动(不拉取master分支),然后推送到远程dev分支。

git checkout dev

git pull origin dev:dev

git merge origin/ver1.0

git push origin dev

ver1.0只作为众多版本中的一个开发分支,目的是版本小组协同开发的基础。 只接受版本开发小组成员的推送(不拉取master代码,而是交给一个负责人去合并master。 如果这里ver1.0拉取master的教训就是ver1.0只作为版本分支开发地位的丢失和复杂化)。

git checkout ver1.0

git pull origin ver1.0

dashi_0514是自己在一个版本下的开发分支,只拉取特定版本分支,和向该版本分支推送自己的修改, 还有就是自己的修改;另外,拉取master最新代码,这样自己就有责任维护ver1.0分支。

git checkouk dashi_0514

git merge origin/master (合并master变化)

git push

git add . (添加自己的修改)

git commit -m “具体修改”

git push

git merge origin/ver1.0

git push

git push origin dashi_0514:ver1.0

本地项目关联远程仓库

附一个gitlab的例子:

Command line instructions
Git global setup

git config --global user.name "白杨"
git config --global user.email "baiyang@google.com"

Create a new repository

git clone http://baiyang@git.com/php/tmk.git
cd tmk
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master

Existing folder

cd existing_folder
git init
git remote add origin http://baiyang@git.com/php/tmk.git
git add .
git commit -m "Initial commit"
git push -u origin master

Existing Git repository

cd existing_repo
git remote add origin http://baiyang@git.com/php/tmk.git
git push -u origin --all
git push -u origin --tags

还有如果你在github创建一个项目,可以看到如下提示:

Quick setup — if you’ve done this kind of thing before
           https://github.com/iBaiYang/PictureWareroom.git
Get started by creating a new file or uploading an existing file. We recommend every repository include a README, LICENSE, and .gitignore. 

…or create a new repository on the command line
echo "# PictureWareroom" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/iBaiYang/PictureWareroom.git
git push -u origin master

…or push an existing repository from the command line
git remote add origin https://github.com/iBaiYang/PictureWareroom.git
git push -u origin master

…or import code from another repository
You can initialize this repository with code from a Subversion, Mercurial, or TFS project.

Git建议开发流程

文件的状态变化周期,四个状态:未跟踪、未修改、已修改、暂存区

三个区域:工作区、暂缓区、历史记录区

工作区是我们能看到的区域,我们在工作区修改增加代码; 完成编辑后,我们用git add 将工作区文件添加到暂存区,也叫索引区; 然后利用git commit 提交文件到我们自己的分支,也就是到本地数据仓库,写入历史记录。

版本负责人 新建版本分支

git checkout master

git pull origin master

git checkout -b ver3.10.0

git push origin ver3.10.0

开发工程师 新建开发分支

git checkout ver3.10.0

git checkout -b dragon190828

git push origin dragon190828

开发工程师 开发细节

git checkout dragon190828

git add .

git commit -m ‘add menu to project’

git push origin dragon190828

git pull origin ver3.10.0

git push origin dragon190828

git checkout dev

git pull origin dev

git pull origin dragon190828

git push origin dev

git checkout dragon190828

git pull origin ver3.10.0

git push origin dragon190828

git push origin dragon190828:ver3.10.0

版本负责人 新建上线分支

git checkout master

git pull origin master

git checkout -b upline190920055

git pull origin ver3.10.0

git push origin upline190220055

项目负责人 版本上线

git checkout master

git pull origin master

git pull origin upline190920055

git pull origin upline190920132

git push origin master

开发工程师 删除开发分支

git branch -d dragon190828

git push origin --delete dragon190828

版本负责人 删除上线分支

git branch -d upline190920055

git push origin --delete upline190920055

拉取远程分支到本地

情况一:本地没有分支关联远程分支

git checkout ver3.42.0

git 会自动把远程分支ver3.42.0拉取到本地并新建对应本地分支ver3.42.0

或者也可以执行下面这句,效果一样,不过可以指定本地分支名

git checkout -b ver3.42.0 origin/ver3.42.0

或者

git branch --track ver3.42.0 origin/ver3.42.0

情况二:本地有一个开发分支,但没有关联远程分支

这种情况,我们只需要把本地分支关联到远程想对应的分支就可以

git branch -u origin/ver3.42.0 ver3.42.0

或者

git branch --set-upstream-to=origin/ver3.42.0 ver3.42.0

关联后,我们可以查看确认一下,有三个命令可用,任选其一

git branch -vv

cat .git/config

git remote show origin

情况三:本地分支已关联到远程分支

这种情况,本地分支已经关联到远程分支,我们就不需要做关联操作了。

版本回退

有三种情况:自己的本地分支版本回退、自己的远程分支版本回退、公共远程分支版本回退, 前两种情况用reset命令,公共远程分支版本回退使用revert命令。下面举例分析一下。

情况一:自己的本地分支版本回退

本地分支开发,发现提交了一个错误的版本,我们可以使用:

git reflog                                        //  查看要回退的版本的commit id

git reset --hard c0deab25                         //  回退版本              

有时在你git reset后发现本地出现未追踪文件,这该怎么办呢?我们需要把这些未追踪文件从本地移除,看一下命令:

git clean -di

可以交互式选择清理的文件。

情况二:自己的远程分支版本回退

如果你的错误提交已经推送到自己的远程分支了,那么就需要回滚远程分支了。

首先要回退本地分支:

> git reflog                                        //  查看要回退的版本的commit id

> git reset --hard c0deab25                         //  回退版本    

紧接着强制推送到远程分支:

git push -f // 强制推送

情况三:公共远程分支版本回退

回滚公共远程分支和回滚自己的远程分支有区别吗? 答案是,当然有区别啦。

一个显而易见的问题:如果你回退公共远程分支,把别人的提交给丢掉了怎么办?

所以需要用到revert命令,只撤销指定一次版本提交。

git log // 查看要回退的版本的commit id

git revert -n 7f213b383d120066fae44931313b447de3ca9255 // revert操作

有时可能提示出现冲突,那我们就去把冲突文件解决掉,然后git add命令添加文件到缓存区,接下来继续操作

git commit -m ‘撤销 指定历史提交,如修改搜索条件’ // 提交文件到本地历史仓库

git push // 推送到远程仓库

如此版本回退成功。

下面说一下特殊情况的处理。

如果有人使用reset命令把你的提交在远程分支也回退了怎么办呢,已经造成了代码丢失。如果你的本地分支还在, 未删除,那么我们可以通过下面的方式找回自己丢失的代码。

假如你的远程master分支情况是这样的:

    A1–A2–B1

其中A、B分别代表两个人,A1、A2、B1代表各自的提交。并且所有人的本地分支都已经更新到最新版本,和远程分支一致。

这个时候你发现A2这次提交有错误,你用reset回滚远程分支master到A1,那么理想状态是你的队友一拉代码git pull,他们的master分支也回滚了, 然而现实却是,你的队友会看到下面的提示:

$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
nothing to commit, working directory clean

也就是说,你的队友的分支并没有主动回退,而是比远程分支超前了两次提交,因为远程分支回退了嘛。

你的队友Tony看到后,知道远程分支被人回退的以前的版本了,他需要把自己的B1提交找回来。他会冷静的如下执行操作:

> git checkout tony_branch            // 先回到自己的分支,因为之前在master分支pull的 

> git reflog                          // 接着看看当前的commit_id,例如:0bbbbb   

> git reset --hard 31313b447          // 回到被覆盖的那次提交B1,B1那一次的commit_id是31313b447

> git checkout -b tony_backup         // 拉个分支,用于保存之前因为回退版本被覆盖掉的提交B1

> git checkout tony_branch            // 拉完分支,迅速回到自己分支

马上回到自己分支的最前端:

git reset --hard 0bbbbbb                         

通过上面一通敲,Tony暂时舒了一口气,还好,B1那次提交找回来了,这时tony_backup分支最新的一次提交就是B1, 接着Tony要把自己的本地master分支和远程master分支保持一致:

git reset --hard origin/master

执行了上面这条命令后,Tony的master分支才真正的回滚了,也就是说你的回滚操作才能对Tony生效,这个时候Tony的本地maser是这样的:

    A1

接着Tony要再次合并那个被丢掉的B1提交:

git checkout master // 切换到master

git merge tony_backup // 再合并一次带有B1的分支到master

好了,Tony终于长舒一口气,这个时候他的master分支是下面这样的:

A1 – B1

终于把丢掉的B1给找回来了,接着他push一下,你一拉也能同步。

如果队友的操作没有使你的提交丢失,那么你拉完代码git pull之后,只需要强制用远程master覆盖掉本地master就可以了:

git reset --hard origin/master

远程分支覆盖本地分支

自己本地代码改了,但现在想用远程分支覆盖本地分支,保留新增文件,覆盖修改文件。

拉取远程版本库:

> git fetch --all

如用远程master分支覆盖本地个人分支

> git reset --hard origin/master

拉取代码,更新分支:

git pull

这种情况可用在生产环境代码部署中。

不过更倾向于切换到master分支,然后拉取最新代码:

git checkout master

git pull

更新远程分支列表

有时远程分支有些已经删了,但本地不能及时看到,可以执行命令:

> git remote update origin --prune

简写:

> git remote update origin --p

查看前后变化:

git branch -a

异常处理

fatal: Pathspec 'xxx' is in submodule 'xxx' 异常的解决方案

在一次用composer更新 phpoffice/phpspreadsheet 软件包时,发现这个包依赖的包 psr/simple-cachemarkbaker/complex, git添加时丢失了, 发现无论怎么改.gitignore文件都无法添加文件到版本控制,在 /vendor/psr/simple-cache 文件夹内git add时报了错: Pathspec '/vendor/psr/simple-cache' is in submodule '/vendor/psr/simple-cache', 搜索后找到方案,要删除git缓存,然后重新添加:

git rm -rf --cached vendor/psr/simple-cache

常用命令整理

git config

git initgit clone

git add

git commit

git diff

git reset

git status

git rm

git log

git show

git tag

git branch

git checkout

git merge

git remote

git push

git pull

git stash

下面让我们逐一介绍。

Git 命令

git config

用法:git config –global user.name “[name]”

用法:git config –global user.email “[email address]”

该命令将分别设置提交代码的用户名和电子邮件地址。

git init

用法:git init [repository name]

该命令可用于创建一个新的代码库。

git clone

用法:git clone [url]

该命令可用于通过指定的URL获取一个代码库。

图片

git add

用法:git add [file]

该命令可以将一个文件添加至stage(暂存区)。

用法:git add *

该命令可以将多个文件添加至stage(暂存区)。

git commit

用法:git commit -m “[ Type in the commit message]”

该命令可以在版本历史记录中永久记录文件。

用法:git commit -a

该命令将提交git add命令添加的所有文件,并提交git add命令之后更改的所有文件。

git diff

用法:git diff

该命令可以显示尚未添加到stage的文件的变更。

用法:git diff –staged

该命令可以显示添加到stage的文件与当前最新版本之间的差异。

用法:git diff [first branch] [second branch]

该命令可以显示两个分支之间的差异。

git reset
用法:git reset [file]
该命令将从stage中撤出指定的文件,但可以保留文件的内容。

用法:git reset [commit]
该命令可以撤销指定提交之后的所有提交,并在本地保留变更。
用法:git reset –hard [commit]
该命令将丢弃所有的历史记录,并回滚到指定的提交。

git status
用法:git status
该命令将显示所有需要提交的文件。
图片

git rm
用法:git rm [file]
该命令将删除工作目录中的文件,并将删除动作添加到stage。

git log
用法:git log
该命令可用于显示当前分支的版本历史记录。

用法:git log –follow[file]
该命令可用于显示某个文件的版本历史记录,包括文件的重命名。

git show
用法:git show [commit]
该命令经显示指定提交的元数据以及内容变更。
图片

git tag
用法:git tag [commitID]
该命令可以给指定的提交添加标签。

git branch
用法:git branch
该命令将显示当前代码库中所有的本地分支。
用法:git branch [branch name]
该命令将创建一个分支。
用法:git branch -d [branch name]
该命令将删除指定的分支。

git checkout
用法:git checkout [branch name]
你可以通过该命令切换分支。
用法:git checkout -b [branch name]
你可以通过该命令创建一个分支,并切换到新分支上。

git merge
用法:git merge [branch name]
该命令可以将指定分支的历史记录合并到当前分支。

git remote
用法:git remote add [variable name] [Remote Server Link]
你可以通过该命令将本地的代码库连接到远程服务器。

git push
用法:git push [variable name] master
该命令可以将主分支上提交的变更发送到远程代码库。
图片

用法:git push [variable name] [branch]
该命令可以将指定分支上的提交发送到远程代码库。
图片

用法:git push –all [variable name]
该命令可以将所有分支发送到远程代码库。
图片

用法:git push [variable name] :[branch name]
该命令可以删除远程代码库上的一个分支。
git pull
用法:git pull [Repository Link]
该命令将获取远程服务器上的变更,并合并到你的工作目录。
图片

git stash
用法:git stash save
该命令将临时保存所有修改的文件。
用法:git stash pop
该命令将恢复最近一次stash(储藏)的文件。
图片

用法:git stash list
该命令将显示stash的所有变更。
用法:git stash drop
该命令将丢弃最近一次stash的变更。






参考资料

https://git-scm.com/book/zh/v2

git 函参 官方文档 https://git-scm.com/docs/

https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

20 个最常用的 Git 命令,码住! https://mp.weixin.qq.com/s/5bryj1dilLyi5AcsglKNkQ

https://www.yiibai.com/git/git_basic_concepts.html

远程仓库版本回退方法 http://www.hzhcontrols.com/new-335876.html

git各种情况的版本回退

https://www.jianshu.com/p/c12203116c48

https://mp.weixin.qq.com/s/2mDnInFnfZPIk7bT-NZPmA

https://mp.weixin.qq.com/s/Vm3yLzm2T67jOY6NoHlLWA

http://www.runoob.com/w3cnote/git-guide.html

Git查看、删除、重命名远程分支和tag

https://www.yiibai.com/git/git_push.html

http://jekyllthemes.org/

https://blog.csdn.net/a19881029/article/details/42245955

https://blog.csdn.net/bin622/article/details/69948525

https://marklodato.github.io/visual-git-guide/index-zh-cn.html

https://blog.csdn.net/qq_15037231/article/details/77937402

https://blog.csdn.net/litianze99/article/details/52452521

https://zhuanlan.zhihu.com/p/28321740

http://jekyllcn.com/

http://wowubuntu.com/markdown/basic.html

http://wowubuntu.com/markdown/#autoescape

https://daringfireball.net/projects/markdown/dingus

https://www.zhihu.com/question/30018945?sort=created

https://pages.github.com/

https://www.jianshu.com/p/6cabb41495c8

https://www.jianshu.com/p/3f355c7872d5

http://www.ruanyifeng.com/blog/2012/08/blogging_with_jekyll.html

http://lixizhi.github.io/

https://html5up.net/

Git出现 fatal: Pathspec ‘xxx’ is in submodule ‘xxx’ 异常的解决方案 https://www.cnblogs.com/ailhc/p/9252431.html

git 远程分支覆盖本地分支 https://jingyan.baidu.com/article/e9fb46e1c67bc83520f7664a.html

Git 更新远程分支列表命令 https://blog.csdn.net/qq_37858386/article/details/111386170


返回