git提交代码 https://www.e-learn.cn/tag/gittijiaodaima zh-hans Genkins git远程分支代码拉取 (四) https://www.e-learn.cn/topic/3552964 <span>Genkins git远程分支代码拉取 (四)</span> <span><span lang="" about="/user/222" typeof="schema:Person" property="schema:name" datatype="">为君一笑</span></span> <span>2020-04-07 10:12:03</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>1.远程拉取gitlab 工程分支,并在本地建立分支</p> <blockquote> <p>具体过程</p> <ul><li>新建一个空文件</li> <li>初始化 git init</li> <li>自己要与origin master建立连接(下划线远程仓库链接)<br />git remote add origin <a href="http://192.168.9.10:8888/root/game-of-life.git" rel="nofollow">http://192.168.9.10:8888/root/game-of-life.git</a></li> <li>把远程分支拉到本地(game-of-live-first_branch为远程仓库的分支名)<br />git fetch origin game-of-live-first_branch</li> <li>在本地创建分支game-of-live-first_branch并切换到该分支<br />git checkout -b game-of-live-first_branch origin/game-of-live-first_branch</li> <li>把game-of-live-first_branch远程分支上的内容都拉取到本地<br />git pull origin game-of-live-first_branch</li> </ul><p><img alt="Genkins git远程分支代码拉取 (四)" class="b-lazy" data-src="https://s4.51cto.com/images/blog/201809/16/c4b534e329f493b1a3989dc1b0d40601.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" data-original="https://s4.51cto.com/images/blog/201809/16/c4b534e329f493b1a3989dc1b0d40601.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /></p> <p><img alt="Genkins git远程分支代码拉取 (四)" class="b-lazy" data-src="https://s4.51cto.com/images/blog/201809/16/c77cfab6229195a2561f8f75666bad30.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" data-original="https://s4.51cto.com/images/blog/201809/16/c77cfab6229195a2561f8f75666bad30.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /></p> </blockquote> <p>2.修改分支的内容并上传给远程分支</p> <blockquote> <p><img alt="Genkins git远程分支代码拉取 (四)" class="b-lazy" data-src="https://s4.51cto.com/images/blog/201809/16/472ec66af337aff36c9e2ba6bf6b6cf0.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" data-original="https://s4.51cto.com/images/blog/201809/16/472ec66af337aff36c9e2ba6bf6b6cf0.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /></p> </blockquote> <p>3.如果想在linux中拉取远程分支代码</p> <blockquote> <p>[root@localhost rollBack]# git init<br />Initialized empty Git repository in /test/rollBack/.git/<br />[root@localhost rollBack]# git remote add origin git@192.168.9.10:root/game-of-life.git<br />[root@localhost rollBack]# git fetch origin game-of-live-first_branch<br />remote: Enumerating objects: 1770, done.<br />remote: Counting objects: 100% (1770/1770), done.<br />remote: Compressing objects: 100% (582/582), done.<br />remote: Total 1770 (delta 1112), reused 1770 (delta 1112)<br />Receiving objects: 100% (1770/1770), 15.00 MiB | 28.20 MiB/s, done.<br />Resolving deltas: 100% (1112/1112), done.<br />From 192.168.9.10:root/game-of-life</p> <ul><li>branch game-of-live-first_branch -&gt; FETCH_HEAD<br />[root@localhost rollBack]# git pull origin game-of-live-first_branch<br />From 192.168.9.10:root/game-of-life</li> <li>branch game-of-live-first_branch -&gt; FETCH_HEAD</li> </ul></blockquote> <p>4.git使用</p> <blockquote> <p>4.1.源码安装git<br />[root@localhost ~]# yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel<br />[root@localhost ~]# yum -y install perl-ExtUtils-MakeMaker package<br />[root@localhost ~]# tar xvf git-2.9.5 -C /usr/src/<br />[root@localhost ~]# cd /usr/src/git-2.9.5<br />[root@localhost git-2.9.5]# make configure<br />GIT_VERSION = 2.9.5<br />GEN configure<br />[root@localhost git-2.9.5]# ./configure --prefix=/usr/local/<br />[root@localhost git-2.9.5]# make &amp;&amp; make install</p> </blockquote> <hr /><blockquote> <p>4.2.配置git</p> <p>[root@localhost git-2.9.5]# git config --global user.name "yunjisuan" #配置git使用用户<br />[root@localhost git-2.9.5]# git config --global user.email "102110504@qq.com" #配置git使用邮箱<br />[root@localhost git-2.9.5]# git config --global color.ui true #语法高亮<br />[root@localhost git-2.9.5]# git config --list 查看全局配置<a href="mailto:br/&gt;user.name=yunjisuan&lt;br/&gt;user.email=102110504@qq.com&lt;br/" rel="nofollow">br/&gt;user.name=yunjisuan<br />user.email=102110504@qq.com<br />color.ui=true</a></p> <p>查看生成的配置文件并添加新模块 #在root下 </p> <p>[root@localhost ~] # cat .gitconfig <br />[user]<br />name = clsn<br />email = admin@znix.top<br />[color]<br />ui = true</p> <p>[root@localhost ~]# cat .gitconfig <br />[user]<br />name = git<br />email = 102110504@qq.com<br />[color]<br />ui = true<br />[recevice] #添加此模块<br />denyCurrentBranch = ignore</p> <p>获得配置命令的手册 #三种方法</p> <p>git help &lt;verb&gt;<br />git &lt;verb&gt; --help<br />man git-&lt;verb&gt;</p> </blockquote> <hr /><blockquote> <p>4.3.配置ssh,增加rsa认证</p> <p>修改配置文件,增加下面内容<br />[root@localhost ~]# vi /etc/ssh/sshd_config<br />RSAAuthentication yes<br />PubkeyAuthentication yes</p> <p>重启<br />[root@localhost ~]# systemctl restart sshd</p> </blockquote> <hr /><blockquote> <p>4.4.获取git仓库(初始化仓库)</p> <p>[root@localhost ~]# mkdir /git_data #创建目录<br />[root@localhost ~]# cd /git_data/<br />[root@localhost git_data]# git init #初始化目录<br />Initialized empty Git repository in /git_data/.git/<br />[root@localhost git_data]# git status #查看工作区状态<br />On branch master<br />Initial commit<br />nothing to commit (create/copy files and use "git add" to track)</p> <p>添加并提交文件<br />[root@localhost git]# touch README<br />[root@localhost git]# echo "please read first" &gt;&gt; README<br />[root@localhost git]# git add *<br />[root@localhost git]# git commit -m "first commit"</p> </blockquote> <hr /><p>5.git仓库的管理</p> <blockquote> <p>5.1向git内增加文件:</p> <p>创建文件<br />[root@localhost git_data]# touch README<br />[root@localhost git_data]# ls<br />README<br />[root@localhost git_data]# git status<br />On branch master<br />Initial commit<br />Untracked files:<br />(use "git add &lt;file&gt;..." to include in what will be committed)<br />README<br />nothing added to commit but untracked files present (use "git add" to track)<br />[root@localhost git_data]# git add ./<em> #添加文件跟踪<br />[root@localhost git_data]# git status<br />On branch master<br />Initial commit<br />Changes to be committed:<br />(use "git rm --cached &lt;file&gt;..." to unstage)<br />new file: README<br />[root@localhost git_data]# tree .git <br />.git<br />├── branches<br />├── config<br />├── description<br />├── HEAD<br />├── hooks<br />│ ├── applypatch-msg.sample<br />│ ├── commit-msg.sample<br />│ ├── post-update.sample<br />│ ├── pre-applypatch.sample<br />│ ├── pre-commit.sample<br />│ ├── prepare-commit-msg.sample<br />│ ├── pre-push.sample<br />│ ├── pre-rebase.sample<br />│ └── update.sample<br />├── index<br />├── info<br />│ └── exclude<br />├── objects<br />│ ├── e6<br />│ │ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391 #查看隐藏目录下增加了一条文件<br />│ ├── info<br />│ └── pack<br />└── refs<br />├── heads<br />└── tags<br />10 directories, 15 files<br />[root@localhost git_data]# git commit -m 'first commit' #由工作区提交到本地仓库<br />[master (root-commit) 621be41] first commit<br />1 file changed, 0 insertions(+), 0 deletions(-)<br />create mode 100644 README<br />[root@localhost git_data]# git status #查看git的状态<br />On branch master<br />nothing to commit, working tree clean<br />[root@localhost git_data]# tree .git/ #提交后的git目录状态<br />.git/<br />├── branches<br />├── COMMIT_EDITMSG<br />├── config<br />├── description<br />├── HEAD<br />├── hooks<br />│ ├── applypatch-msg.sample<br />│ ├── commit-msg.sample<br />│ ├── post-update.sample<br />│ ├── pre-applypatch.sample<br />│ ├── pre-commit.sample<br />│ ├── prepare-commit-msg.sample<br />│ ├── pre-push.sample<br />│ ├── pre-rebase.sample<br />│ └── update.sample<br />├── index<br />├── info<br />│ └── exclude<br />├── logs<br />│ ├── HEAD<br />│ └── refs<br />│ └── heads<br />│ └── master<br />├── objects<br />│ ├── 54<br />│ │ └── 3b9bebdc6bd5c4b22136034a95dd097a57d3dd<br />│ ├── 62<br />│ │ └── 1be41481cd4dd65b58d1400173228125cdeb5b<br />│ ├── e6<br />│ │ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391<br />│ ├── info<br />│ └── pack<br />└── refs<br />├── heads<br />│ └── master<br />└── tags<br />15 directories, 21 files<br />总结说:<br />git add </em> 添加到暂存区域<br />git commit 提交git仓库 -m 后面接上注释信息,内容关于本次提交的说明,方便自己或他人查看</p> </blockquote> <hr /><blockquote> <p>5.2删除git内文件</p> <p>1) 没有添加到暂存区的数据直接rm删除即可。<br />2) 已经添加到暂存区数据:<br />git rm --cached database <br />#→将文件从git暂存区域的追踪列表移除(并不会删除当前工作目录内的数据文件)<br />git rm -f database<br />#→将文件数据从git暂存区和工作目录一起删除</p> </blockquote> <hr /><blockquote> <p>5.3改(重命名数据)</p> <p>1)没有添加到暂存区的数据直接mv/rename改名即可。<br />2)已经添加到暂存区数据:<br />git mv README NOTICE #这个改的时候工作目录里的文件名字也改了</p> </blockquote> <hr /><blockquote> <p>5.4查 (查看历史记录)<br />• git log #→查看提交历史记录<br />• git log -2 #→查看最近几条记录<br />• git log -p -1 #→-p显示每次提交的内容差异,例如仅查看最近一次差异<br />• git log --stat -2 #→--stat简要显示最近两次,数据增改行数,这样能够看到提交中修改过的内容,对文件添加或移动的行数,并在最后列出所有增减行的概要信息<br />• git log --pretty=oneline #→--pretty根据不同的格式展示提交的历史信息<br />• git log --pretty=fuller -2 #→以更详细的模式输出提交的历史记录<br />• git log --pretty=fomat:"%h %cn" #→查看当前所有提交记录的简短SHA-1哈希字串与提交着的姓名。<br />使用format参数来指定具体的输出格式<br />格式 说明<br />%s 提交说明<br />%cd 提交日期<br />%an 作者的名字<br />%cn 提交者的姓名<br />%ce 提交者的电子邮件<br />%H 提交对象的完整SHA-1哈希字串<br />%h 提交对象的简短SHA-1哈希字串<br />%T 树对象的完整SHA-1哈希字串<br />%t 树对象的简短SHA-1哈希字串<br />%P 父对象的完整SHA-1哈希字串<br />%p 父对象的简短SHA-1哈希字串<br />%ad 作者的修订时间</p> </blockquote> <hr /><blockquote> <p>5.5还原历史数据</p> <p>Git服务程序中有一个叫做HEAD的版本指针,当用户申请还原数据时,其实就是将HEAD指针指向到某个特定的提交版本,但是因为Git是分布式版本控制系统,为了避免历史记录冲突,故使用了SHA-1计算出十六进制的哈希字串来区分每个提交版本,另外默认的HEAD版本指针会指向到最近的一次提交版本记录,而上一个提交版本会叫HEAD^,上上一个版本则会叫做HEAD^^,当然一般会用HEAD~5来表示往上数第五个提交版本。<br />git reset --hard hash :<br />• git reset --hard HEAD^ #→还原历史提交版本上一次<br />• git reset --hard 3de15d4 #→找到历史还原点的SHA-1值后,就可以还原(值不写全,系统会自动匹配)</p> </blockquote> <hr /><blockquote> <p>5.6还原未来数据</p> <p>什么是未来数据?就是你还原到历史数据了,但是你后悔了,想撤销更改,但是git log已经找不到这个版本了。<br />git reflog #→查看未来历史更新点<br />[root@localhost git_data]# git reflog<br />b6a6e89 HEAD@{0}: reset: moving to HEAD^<br />519bf0d HEAD@{1}: commit: third commit<br />b6a6e89 HEAD@{2}: commit: second commit<br />621be41 HEAD@{3}: commit (initial): first commit<br />[root@localhost git_data]# git reset --hard 519b #在删除third commit情况下返回third commit<br />HEAD is now at 519bf0d third commit</p> </blockquote> <hr /><blockquote> <p>5.7标签使用</p> <p>前面回滚使用的是一串字符串,又长又难记。<br />git tag v1.0 #→当前提交内容打一个标签(方便快速回滚),每次提交都可以打个tag。<br />git tag #→查看当前所有的标签<br />git show v1.0 #→查看当前1.0版本的详细信息<br />git tag v1.2 -m "version 1.2 release is test" #→创建带有说明的标签,-a指定标签名字,-m指定说明文字<br />git tag -d v1.0 #→我们为同一个提交版本设置了两次标签,删除之前的v1.0<br />[root@localhost git_data]# git reset --hard HEAD^ #还原历史数据<br />HEAD is now at b6a6e89 second commit<br />[root@localhost git_data]# git reset --hard v1.0 #利用标签回滚<br />HEAD is now at 519bf0d third commit</p> </blockquote> <hr /><blockquote> <p>5.8对比数据</p> <p>git diff可以对比当前文件与仓库已保存文件的区别,知道了对README作了什么修改后,再把它提交到仓库就放⼼多了。<br />git diff README<br />[root@localhost git_data]# echo 222 &gt;&gt; README <br />[root@localhost git_data]# git diff README <br />diff --git a/README b/README<br />index 2bbe845..56c43c1 100644<br />--- a/README<br />+++ b/README<br />@@ -1,2 +1,3 @@<br />111<br />111<br />+222</p> </blockquote> <hr /><p>6..分支结构</p> <blockquote> <p>6.1 增加分支<br />git branch 分支名称</p> </blockquote> <hr /><blockquote> <p>6.2分支切换<br />[root@localhost git_data]# git branch #查看分支<br />linux</p> <ul><li>master<br />[root@localhost git_data]# git checkout linux #切换到分支 'linux'<br />M README<br />Switched to branch 'linux'<br />[root@localhost git_data]# git branch</li> <li>linux<br />master</li> </ul></blockquote> <hr /><blockquote> <p>6.3在linux分支进行修改</p> <p>例:就是切换到分支后进行普通操作</p> <p>echo "clsn in linux" &gt;&gt; README</p> </blockquote> <hr /><blockquote> <p>6.4合并代码</p> <p>合并Linux上的代码到master上</p> <p>git merge linux</p> </blockquote> <hr /><blockquote> <p>6.5合并失败解决</p> <p>模拟冲突,在文件的同一行做不同修改</p> <p>在master 分支进行修改<br />[root@gitlab git_data]# cat README <br />2017年11月30日<br />[root@gitlab git_data]# echo "clsn in master"&gt;&gt; README <br />[root@gitlab git_data]# git commit -a -m "clsn 2017年11月30日 09点20分 "<br />[master 7ab71d4] clsn 2017年11月30日 09点20分<br />1 file changed, 1 insertion(+)</p> <p>切换到linux分支<br />[root@gitlab git_data]# git checkout linux <br />[root@gitlab git_data]# cat README <br />2017年11月30日<br />[root@gitlab git_data]# echo "clsn in linux" &gt;&gt; README <br />[root@gitlab git_data]# git commit -a -m "2017年11月30日 03"<br />[linux 20f1a13] 2017年11月30日 03<br />1 file changed, 1 insertion(+)</p> <p>回到master分区,进行合并,出现冲突<br />[root@gitlab git_data]# git checkout master <br />切换到分支 'master'<br />[root@gitlab git_data]# git merge linux</p> <p>冲突(内容):合并冲突于 README<br />自动合并失败,修正冲突然后提交修正的结果。</p> <p>解决冲突<br />[root@gitlab git_data]# vim README <br />2017年11月30日<br />clsn in master<br />clsn in linux<br />#手工解决冲突<br />[root@gitlab git_data]# git commit -a -m "2017年11月30日 03"<br />[master b6a097f] 2017年11月30日 03</p> </blockquote> <hr /><blockquote> <p>6.6删除分支</p> <p>因为之前已经合并了linux分支,所以现在看到它在列表中。</p> <p>在这个列表中分支名字前没有 * 号的分支通常可以使用 git branch -d 删除掉;你已经将它们的工作整合到了另一个分支,所以并不会失去任何东西。<br />git branch --no-merged #查看所有包含未合并工作的分支</p> <p>git branch -d 分支name </p> </blockquote> <hr /><p>7.服务器命令总结</p> <blockquote> <p>服务器上的管理命令</p> <pre><code> mkdir: //XX (创建一个空目录 XX指目录名)</code></pre> <p>  pwd: // 显示当前目录的路径。<br />  git init //把当前的目录变成可以管理的git仓库,生成隐藏.git文件。<br />  git add XX //把xx文件添加到暂存区去。<br />  git commit –m “XX” //提交文件 –m 后面的是注释。<br />  git status //查看仓库状态<br />  git diff XX // 查看XX文件修改了那些内容<br />  git log //查看历史记录<br />  git reset --hard HEAD^ //或者 git reset --hard HEAD~ 回退到上一个版本(如果想回退到100个版本,使用git reset –hard HEAD~100 )<br />  cat XX //查看XX文件内容<br />  git reflog //查看历史记录的版本号id<br />  git checkout -- XX //把XX文件在工作区的修改全部撤销。<br />  git rm XX //删除XX文件<br />  git checkout –b dev //创建dev分支 并切换到dev分支上<br />  git branch //查看当前所有的分支<br />  git checkout master // 切换回master分支<br />  git merge dev //在当前的分支上合并dev分支<br />  git branch –d dev //删除dev分支<br />  git branch name //创建分支<br />  git stash //把当前的工作隐藏起来 等以后恢复现场后继续工作<br />  git stash list //查看所有被隐藏的文件列表<br />  git stash apply //恢复被隐藏的文件,但是内容不删除<br />  git stash drop //删除文件<br />  git stash pop //恢复文件的同时 也删除文件<br />  git remote //查看远程库的信息<br />  git remote –v //查看远程库的详细信息<br />  <br />git remote add origin <a href="https://github.com/" rel="nofollow">https://github.com/</a>-- //关联一个远程库 --为路径<br />  git push –u origin master //(第一次要用-u 以后不需要)把当前master分支推送到远程库<br />  git push origin master //Git会把master分支推送到远程库对应的远程分支上<br />  git clone <a href="https://github.com/" rel="nofollow">https://github.com/</a>--- // 从远程库中克隆 --为路径</p> <pre><code> 远程仓库相关命令 检出仓库: $ git clone 查看远程仓库:$ git remote -v 添加远程仓库:$ git remote add 删除远程仓库:$ git remote rm 修改远程仓库:$ git remote set-url --push 拉取远程仓库:$ git pull 推送远程仓库:$ git push *如果想把本地的某个分支test提交到远程仓库,并作为远程仓库的master分支,或者作为另外一个名叫test的分支,如下: $git push origin test:master // 提交本地test分支作为远程的master分支 $git push origin test:test // 提交本地test分支作为远程的test分支</code></pre> </blockquote><div class="alert alert-success" role="alert"><p>来源:<code>51CTO</code></p><p>作者:<code>运维小白菜</code></p><p>链接:<code>https://blog.51cto.com/13893093/2175764</code></p></div></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/origin" hreflang="zh-hans">origin</a></div> <div class="field--item"><a href="/tag/git" hreflang="zh-hans">git</a></div> <div class="field--item"><a href="/tag/gittijiaodaima" hreflang="zh-hans">git提交代码</a></div> <div class="field--item"><a href="/tag/gitqiehuanfenzhi" hreflang="zh-hans">git切换分支</a></div> <div class="field--item"><a href="/tag/linuxfuwuqi" hreflang="zh-hans">linux服务器</a></div> <div class="field--item"><a href="/tag/wenjianmulu" hreflang="zh-hans">文件目录</a></div> <div class="field--item"><a href="/tag/banbenkongzhixitong" hreflang="zh-hans">版本控制系统</a></div> <div class="field--item"><a href="/tag/linuxxitong" hreflang="zh-hans">linux系统</a></div> <div class="field--item"><a href="/tag/gitlab" hreflang="zh-hans">gitlab</a></div> <div class="field--item"><a href="/tag/test" hreflang="zh-hans">test</a></div> <div class="field--item"><a href="/tag/master" hreflang="zh-hans">master</a></div> </div> </div> Tue, 07 Apr 2020 02:12:03 +0000 为君一笑 3552964 at https://www.e-learn.cn pycharm git 创建分支以及打标签(TAG) https://www.e-learn.cn/topic/3552864 <span>pycharm git 创建分支以及打标签(TAG)</span> <span><span lang="" about="/user/176" typeof="schema:Person" property="schema:name" datatype="">浪尽此生</span></span> <span>2020-04-07 09:50:29</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"> <p></p><div class="toc"><div class="toc-container-header">目录</div><ul><li><a href="#前提">前提</a></li><li><a href="#分支管理">分支管理</a></li><li><a href="#标签管理">标签管理</a></li><li><a href="#参考">参考</a></li></ul></div> <h2 id="前提">前提</h2> <p>基于本地已创建git 项目</p> <h2 id="分支管理">分支管理</h2> <p>1 VCS---&gt;Git----&gt; Branches<br /><img alt="" class="b-lazy" data-src="https://img2020.cnblogs.com/blog/1948244/202004/1948244-20200407091042408-1859044900.png" data-original="https://img2020.cnblogs.com/blog/1948244/202004/1948244-20200407091042408-1859044900.png" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /></p> <p>2 创建新分支或者选择本地已有分支<br /><img alt="" class="b-lazy" data-src="https://img2020.cnblogs.com/blog/1948244/202004/1948244-20200407091147353-72366028.png" data-original="https://img2020.cnblogs.com/blog/1948244/202004/1948244-20200407091147353-72366028.png" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /></p> <p>3 编辑器右下角可以快速创建分支以及切换分支<br /><img alt="" class="b-lazy" data-src="https://img2020.cnblogs.com/blog/1948244/202004/1948244-20200407091329839-797293741.png" data-original="https://img2020.cnblogs.com/blog/1948244/202004/1948244-20200407091329839-797293741.png" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /></p> <h2 id="标签管理">标签管理</h2> <p>1 VCS---&gt;Git----&gt; Tag<br /><img alt="" class="b-lazy" data-src="https://img2020.cnblogs.com/blog/1948244/202004/1948244-20200407091508301-1891487379.png" data-original="https://img2020.cnblogs.com/blog/1948244/202004/1948244-20200407091508301-1891487379.png" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /></p> <p>2 在Version Contral中右键选中一个提交历史可以创建分支或者标签</p> <p><img alt="" class="b-lazy" data-src="https://img2020.cnblogs.com/blog/1948244/202004/1948244-20200407091647192-849172317.png" data-original="https://img2020.cnblogs.com/blog/1948244/202004/1948244-20200407091647192-849172317.png" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /></p> <p>3 同步到git版本服务器</p> <p>VCS---&gt;Git----&gt; Push</p> <p>选中 push tags ALL<br /><img alt="" class="b-lazy" data-src="https://img2020.cnblogs.com/blog/1948244/202004/1948244-20200407091951344-2129595274.png" data-original="https://img2020.cnblogs.com/blog/1948244/202004/1948244-20200407091951344-2129595274.png" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /></p> <p>4 在服务器端可以查看到标签以及分支<br /><img alt="" class="b-lazy" data-src="https://img2020.cnblogs.com/blog/1948244/202004/1948244-20200407092101373-303529068.png" data-original="https://img2020.cnblogs.com/blog/1948244/202004/1948244-20200407092101373-303529068.png" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><br /><img alt="" class="b-lazy" data-src="https://img2020.cnblogs.com/blog/1948244/202004/1948244-20200407092120707-175121068.png" data-original="https://img2020.cnblogs.com/blog/1948244/202004/1948244-20200407092120707-175121068.png" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /></p> <h2 id="参考">参考</h2> <p>仓库的分支(Branch)规范,影响到每个团队的工作流的一致性;标签(Tag)便于开发团队、测<br /> 试团队和其他团队识别每个项目的版本,特别是在协同处理线上问题的时候,大家可以非常清楚<br /> 地知道线上运行版本和代码库的对应关系。因此我们在制作的时候,主要考虑几个因素:</p> <ul><li>一是要有一定的规则,方便持续集成CI(自动化构建、测试、分布等)</li> <li>二是要有一定的自由度,以适应不同团队的内部协作灵活性</li> <li>要清晰规整,不要参差不齐难以识别</li> </ul><p>基于我们当前团队的协作能力和提交代码的质量水平,并考虑方便持续集成CI(自动化构建、<br /> 测试、发布),我们约定下列常驻Branch:</p> <ul><li>develop 分支:顾名思义即持续开发的分支,我们希望每个开发组都在这个分支上保<br /> 持线性的持续小步迭代,正常的CodeReview WorkFlow和开发级的自动CI也在这里进行。<br /> 当开发完一个迭代(Sprint),开发小组有信心转测时,就将代码合并到 release 分支,<br /> 并要求打一个alpha级的Tag(如5.2.0-alpha)</li> <li>release 分支:顾名思义即用于发布过程的分支,包括开发转测(实际上我们认为这里的测试集成测试)、测试和BugFix以及发布上线的过程,当发布成功时要打一个发布beta Tag(如<br /> 5.2.1-beta),并将代码合并到 master 分支</li> <li>master 分支:即有质量保证的、可安全运行的分支,禁止直接代码提交,避免被污染,仅用<br /> 于代码合并和归集,在这个分支上的代码应该永远是可用的、稳定的。当需要拉一个特别的开发分时,<br /> 应该基于 master。<br /> 当需要fix线上的一个问题是,应该基于上线时的那个beta Tag做hotfix。当出现线上Bug需要hotfix时,我们需要在上次上线的Tag处拉一个临时的 hotfix 分支进行<br /> 修正,或者在未被其他开发迭代污染的release分支上直接hotfix上线并合并到master和<br /> develop,然后打一个新的Tag(如5.2.2-beta)</li> </ul><p>这个分支体系是我们期望长期持续迭代的分支规划,其它临时分支的删除、创建、命名,都由团队自己<br /> 决定,保持一定的灵活性。但每个团队都应该努力避免对上述常规情况造成破坏的情况发生,如果有特<br /> 殊情况(如有两个并行的开发分支同步进行),需要由各组Leader和QA团队协商提供临时方案,这会<br /> 影响到团队协同中的转测、CI基准分支等。</p> <p>关于打 Tag 的规则 :</p> <p>鼓励开发和QA团队共同对勤于打Tag,这便于真正的版本管理,避免有rollback需要或者需要查看和<br /> 对比历史版本的时候的混乱和低效局面。但同时也要求一定的规范性,让人一看便知。</p> <p>Tag格式为: MajorVersion.MinorVersion.FixVersion-TypeLabel,其中TypeLabel<br /> 为 alpha、 beta、 devel。具体参见下图举例,其中devel是留给开发过程中<br /> 使用的。</p> <p>分工上,开发团队负责打 tag-alpha,测试团队负责打 tag-beta。</p> <p>但是,自己决定并不意味着胡乱命名,大家仍然要以 语义明(白)(准)确 的原则<br /> 来管理自己的分支和标签名,因为所有这些都是为了提高协作效率。</p> <p>这是一个参考示意图:<br /><img alt="" class="b-lazy" data-src="https://img2020.cnblogs.com/blog/1948244/202004/1948244-20200407092251052-369027538.png" data-original="https://img2020.cnblogs.com/blog/1948244/202004/1948244-20200407092251052-369027538.png" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /></p> <p>事实上,上图和常用的 Git 分支实践是比较相似的,只是为了方便自动化工作,我们将 release 分支常驻并配合 tag 管理了,其他工作的 workflow 基本相似,如下图:<br /><img alt="" class="b-lazy" data-src="https://img2020.cnblogs.com/blog/1948244/202004/1948244-20200407092307916-1637011543.png" data-original="https://img2020.cnblogs.com/blog/1948244/202004/1948244-20200407092307916-1637011543.png" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /></p> <p>这里写图片描述</p> <p>必读经典:A successful Git branching model</p> <p>参考文章:GIT分支管理是一门艺术<br /> 参考:<a href="https://blog.csdn.net/iprettydeveloper/article/details/53944125" rel="nofollow">https://blog.csdn.net/iprettydeveloper/article/details/53944125</a></p> <div class="alert alert-success" role="alert"><p>来源:<code>https://www.cnblogs.com/lduml/p/12651449.html</code></p></div></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/git" hreflang="zh-hans">git</a></div> <div class="field--item"><a href="/tag/gitqiehuanfenzhi" hreflang="zh-hans">git切换分支</a></div> <div class="field--item"><a href="/tag/gittijiaodaima" hreflang="zh-hans">git提交代码</a></div> </div> </div> Tue, 07 Apr 2020 01:50:29 +0000 浪尽此生 3552864 at https://www.e-learn.cn git的学习笔记 https://www.e-learn.cn/topic/3551840 <span>git的学习笔记</span> <span><span lang="" about="/user/69" typeof="schema:Person" property="schema:name" datatype="">本秂侑毒</span></span> <span>2020-04-07 05:53:16</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"> <p>1. 安装git<br /> centos上   </p> <pre><code class="language-bash">yum install -y epel-release yum install -y git</code></pre> <p><br /> 2. 创建版本库</p> <pre><code class="language-bash">mkdir  /home/gitroot cd /home/gitroot git init   ##用这个命令初始化,让这个目录变成git可以管理的仓库</code></pre> <p><br /> 3. 提交文件到仓库<br /> 创建一个文件 1.txt</p> <pre><code class="language-bash">echo -e "123\naaa\n456\nbbb" &gt; 1.txt</code></pre> <pre><code class="language-bash">git add 1.txt  //把1.txt添加到仓库中 git commit -m "add new file 1.txt"   //add完了必须要commit才算真正把文件提交到git仓库里</code></pre> <p><br /> 初始使用该命令会提示:<br /> *** Please tell me who you are.<br /><br /> Run<br /><br /> git config --global user.email "you@example.com"<br /> git config --global user.name "Your Name"<br /><br /> to set your account's default identity.<br /> Omit --global to set the identity only in this repository.<br /><br /><br /> 这是要让我们设置用户邮箱和用户名。根据它提示设置一下即可:<br /> git config --global user.email "aming@aminglinux.com"<br /><br /> git config --global user.name "aming"<br /><br /><br /> echo -e "111111\n2222222222" &gt;&gt; 1.txt  //先更改一下1.txt<br /> git status   //查看当前仓库中的状态,比如是否有改动的文件<br /> git diff 1.txt  //可以对比1.txt本次修改了什么内容,相比较仓库里面的版本<br /><br /> 4. 版本回退<br /> 多更改几次1.txt,并进行 git add,  git commit操作<br /> git log  //可以查看所有提交git仓库的记录操作<br /> git log --pretty=oneline  //一行显示,更清楚 <br /><br /> 通过git log我们可以查看到过去提交的所有版本,所以根据这个log,我们可以指定回退某个版本<br /> 比如,结果如下<br /> git log --pretty=oneline<br /> 142dde7c32cf8c2e4b59b6fafae468dedbb72ff9 change 1.txt<br /> 0ff5ab178ea2207e71fbe935c57a8ef1c30f63d7 change 1.txt<br /> 5aacaf4341484186802faed7d2db87840b2adc66 new file 2.txt<br /> 73235a8549b7e9cfa171d632e1a8f0d91cd0a0d5 new file<br /><br /><br /> git reset --hard 0ff5ab1  //可以回退到第二行的这个版本,这里后面跟的字符串可以简写。<br /> 当回退到该版本后,再  git log 则最上面的版本不再显示了,那如果想再倒回退到第一行那个版本怎么办?<br /> git reflog  //可以显示所有的版本<br /><br /> 5. 撤销修改<br /> 修改1.txt,发现改的不对,想恢复到上一次提交时的状态。或者1.txt不小心给删除掉了。可以使用<br /> git checkout -- 1.txt  //恢复到上一次提交时的状态<br /><br /> 如果1.txt修改完了,保存后,git add 1.txt了,但没有commit,再想回退到上一次提交时的状态。可以使用<br /> git  reset HEAD 1.txt<br /> 然后再<br /> git checkout -- 1.txt<br /><br /> 那如果不仅add也commit了,那就用第4版本回退的方法。<br /><br /> 6. 删除<br /> touch  2.txt<br /> echo "22222222222222" &gt; 2.txt<br /> git add 2.txt<br /> git commit -m "add new file 2.txt" <br /><br /> 上面的操作,我们在git仓库里提交了一个新的文件2.txt,下面删除它<br /> rm -f 2.txt<br /> git status //可以看到,提示2.txt文件被删除了<br /> 如果要想恢复,直接用  git  checkout -- 2.txt<br /> 现在是,我们想在git仓库里删除<br /> git rm 2.txt<br /> git commit -m "delete 2.txt" <br /> 这样就彻底删除了2.txt<br /><br /> 7. 做一个远程仓库(github)<br /> 首先到 <a href="https://github.com/" target="_blank" rel="nofollow">https://github.com</a> 注册一个账号,创建自己的git,点repositories  --&gt; new<br /> 名字自定义,比如叫studygit  选择public  点 create repository<br /><br /> 添加key:<br /> 右上角点自己头像,选择settings,左侧选择SSH and GPG keys<br /> 右上角点New SSH key,把linux机器上的 /root/.ssh/id_rsa.pub内容粘贴到这里<br /><br /> 把本地参考推送到远程仓库<br /> git remote add origin <a href="mailto:git@github.com" target="_blank" rel="nofollow">git@github.com</a>:aminglinux/studygit.git<br /> git push -u origin master<br /> 下一次再推送,就可以直接 git push <br /><br /><br /> 下面我们克隆一个远程仓库过来<br /> cd /home<br /> git clone  <a href="mailto:git@github.com" target="_blank" rel="nofollow">git@github.com</a>:aminglinux/lanmp.git<br /> 它提示,会在当前目录下初始化一个仓库,并创建一个.git的目录<br /> Initialized empty Git repository in /home/lanmp/.git/<br /><br /> 完成后,ls可以看到一个lanmp的目录<br /> cd  lanmp<br /> vi lanmp.sh 编辑一下文件,然后提交<br /> git add lanmp.sh<br /> git commit -m "sdlfasdf" <br /> 然后再推送到远程服务端<br /> git push<br /><br /> 8. 分支管理<br /> 查看分支<br /> git branch<br /><br /> 创建分支<br /> git branch aming<br /> git checkout  aming<br /><br /> 在aming分支下 ,编辑2.txt,并提交到新分支<br /> echo "askdfjlksadjflk" &gt;  2.txt<br /> git add 2.txt<br /> git commit -m "laksjdflksjdklfj" <br /><br /> 切换回master分支<br /> git checkout master<br /><br /> 合并分支<br /> git merge aming   //把aming分支合并到了master<br /><br /> 如果master分支和aming分支都对2.txt进行了编辑,当合并时会提示冲突,需要先解决冲突才可以继续合并。<br /> 解决冲突的方法是在master分支下,编辑2.txt,改为aming分支里面2.txt的内容。 然后提交2.txt,再合并aming分支。<br /> 但是这样有一个问题,万一master分支更改的内容是我们想要的呢? 我们可以编辑2.txt内容,改为我们想要的,然后提交。切换到aming分支,然后合并master分支到aming分支即可。(倒着合并)合并分支有一个原则,那就是要把最新的分支合并到旧的分支。也就是说merge后面跟的分支名字一定是最新的分支。<br /><br /> 删除分支<br /> git  branch -d aming<br /> 如果分支没有合并,删除之前会提示,那我们就不想合并,强制删除<br /> git branch -D aming<br /><br /> 对于分支的应用,建议大家以这样的原则来:<br /> master分支是非常重要的,线上发布代码用这个分支,平时我们开发代码不要在这个分支上。<br /> 创建一个dev分支,专门用作开发,只有当发布到线上之前,才会把dev分支合并到master<br /> 开发人员应该在dev的基础上再分支成个人分支,个人分支(在自己pc上)里面开发代码,然后合并到dev分支<br /><img width="498" class="b-lazy" data-src="http://static.oschina.net/uploads/img/201609/04210557_0uLI.png" data-original="http://static.oschina.net/uploads/img/201609/04210557_0uLI.png" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /> <br /><br /><br /> 在dev分支合并bob分支的命令是:<br /> git checkout dev   //先切换到dev分支,然后<br /> git merge bob<br /><br /> 9. git stash 保留现场<br /> 当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则以后你无法回到这个工作点。解决这个问题的办法就是git stash命令。<br /><br /><br /> 比如我们在aming分支,编辑了一个新的文件3.txt<br /> 这时候我们需要到其他分支去修复一个bug,所以需要先git add 3.txt<br /> 然后 git  stash  保存一下现场<br /> 再切换到另外分支去修复bug,修复完bug后,再回到aming分支<br /> git stash list 可以看到我们保存过的现场<br /> 用 git stash apply 恢复现场<br /> 也可以指定stash:<br /> git stash apply stash@{1}<br /><br /><br /> 10. 远程分支<br /> 查看远程库信息,使用git remote -v  本地新建的分支如果不推送到远程,对其他人就是不可见的<br /> 查看远程分支  git ls-remote origin<br /> 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交<br /> 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致<br /> 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。<br /><br /><br /><br /> 11. 标签管理<br /> 标签类似于快照功能,我们可以给版本库打一个标签,记录某个时刻库的状态。我们可以随时恢复到该状态。<br /> git checkout master 先切到master分支上<br /> git tag v1.0  给master打一个标签v1.0<br /><br /> git tag 可以查看所有的标签<br /><br /> tag是针对commit来打标签的,所以可以针对历史的commit来打tag<br /> git log --pretty=oneline --abbrev-commit<br /> git tag v0.9 46d3c1a<br /> git tag -a v0.8 -m "tag just v1.1 and so on"  5aacaf4  //可以对标签进行描述<br /><br /> git tag -d v0.8  //删除标签<br /><br /><br /> git push origin v1.0   //推送指定标签到远程<br /> git push --tag origin   //推送所有标签<br /><br /> 如果本地删除了一个标签,远程也想要删除需要这样操作:<br /><br /> git tag v1.0 -d<br /> git push origin :refs/tags/v1.0<br /><br /><br /> 12. 巧用别名<br /> git commit 这个命令是不是有点长? 用别名可以提高我们的工作xiaol<br /> git config --global alias.ci commit <br /> git config --global alias.co  checkout<br /> git config --global alias.br  branch<br /><br /> 查看git别名使用命令<br /> git config --list |grep alias<br /><br /><br /> 查询log小技巧:<br /> git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)&lt;%an&gt;%Creset' --abbrev-commit"<br /><br /> 取消别名<br /> git config --global --unset alias.br<br /><br /><br /> 13. 搭建git服务器<br /> github毕竟是公开的,而私有仓库又得花钱买。所以我们可以想办法搭建一个私有的,只自己公司使用的。<br /> yum install git //安装git<br /> useradd -s /usr/bin/git-shell git   //添加git用户,并且设置shell为/usr/bin/git-shell,目的是为了不让git用户远程登陆<br /> cd /home/git<br /> mkdir .ssh<br /> touch .ssh/authorized_keys<br /><br /> chown -R git.git .ssh<br /> chmod 600 .ssh/authorized_keys<br /><br /> 定好存储git仓库的目录,比如 /data/gitroot<br /> mkdir /data/gitroot<br /> cd /data/gitroot<br /> git init --bare sample.git // 会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾<br /> chown -R git.git sample.git<br /><br /><br /> 在客户端上(自己pc)克隆远程仓库<br /> 以上操作是在git服务器上做的,平时git服务器是不需要开发人员登录修改代码的,它仅仅是充当着一个服务器的角色,就像github一样,平时操作都是在我们自己的pc上做的。<br /> 首先要把客户端上的公钥放到git服务器上/home/git/.ssh/authorized_keys文件里<br /> git clone git@ip:/data/gitroot/sample.git<br /><br /> 此时就可以在当前目录下生成一个sample的目录,这个就是我们克隆的远程仓库了。进入到这里面,可以开发一些代码,然后push到远程。</p> <div class="alert alert-success" role="alert"><p>来源:<code>oschina</code></p><p>链接:<code>https://my.oschina.net/u/613887/blog/742224</code></p></div></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/git" hreflang="zh-hans">git</a></div> <div class="field--item"><a href="/tag/master" hreflang="zh-hans">master</a></div> <div class="field--item"><a href="/tag/gitfuwuqidajianlinux" hreflang="zh-hans">git服务器搭建linux</a></div> <div class="field--item"><a href="/tag/gittijiaodaima" hreflang="zh-hans">git提交代码</a></div> <div class="field--item"><a href="/tag/gitqiehuanfenzhi" hreflang="zh-hans">git切换分支</a></div> <div class="field--item"><a href="/tag/cangku" hreflang="zh-hans">仓库</a></div> </div> </div> Mon, 06 Apr 2020 21:53:16 +0000 本秂侑毒 3551840 at https://www.e-learn.cn Git Tag 标签 https://www.e-learn.cn/topic/3551289 <span>Git Tag 标签</span> <span><span lang="" about="/user/202" typeof="schema:Person" property="schema:name" datatype="">醉酒当歌</span></span> <span>2020-04-07 03:43:17</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"> <div>git tag 按字母排序显示标签</div> <div> </div> <div>git tag v1.01 打上v1.01这个标签</div> <div> </div> <div>git show v1.01 显示这个标签的详情</div> <div> </div> <div>可以同时打多个tag指向同一个时间点上的版本</div> <div> </div> <div>git push origin --tags 推送本地所有新增标签到远端</div> <div> </div> <div>ps:下面看下git命令之git tag 给当前分支打标签</div> <p> </p> <div><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/04/07/465d140416c36863a37e074b04c1b731.jpg" data-original="https://www.eimg.top/images/2020/04/07/465d140416c36863a37e074b04c1b731.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p></div> <div>列出标签</div> <div> </div> <div>$ git tag # 在控制台打印出当前仓库的所有标签</div> <div>$ git tag -l ‘v0.1.*' # 搜索符合模式的标签</div> <div> </div> <div>打标签</div> <div> </div> <div><a class="tag_link" title="View all posts in git标签" href="https://www.cnraksmart.com/tag/git%e6%a0%87%e7%ad%be/" target="_blank" rel="nofollow">git标签</a>分为两种类型:轻量标签和附注标签。轻量标签是指向提交对象的引用,附注标签则是仓库中的一个独立对象。建议使用附注标签。</div> <div># 创建轻量标签</div> <div>$ git tag v0.1.2-light</div> <div> # 创建附注标签</div> <div>$ git tag -a v0.1.2 -m “0.1.2版本”</div> <div> </div> <div>创建轻量标签不需要传递参数,直接指定标签名称即可。</div> <div> </div> <div>创建附注标签时,参数a即annotated的缩写,指定标签类型,后附标签名。参数m指定标签说明,说明信息会保存在标签对象中。</div> <div> </div> <div>切换到标签</div> <div> </div> <div>与切换分支命令相同,用git checkout [tagname]</div> <div> </div> <div>查看标签信息</div> <div> </div> <div>用git show命令可以查看标签的版本信息:</div> <div> </div> <div>$ git show v0.1.2</div> <div> </div> <div>删除标签</div> <div> </div> <div>误打或需要修改标签时,需要先将标签删除,再打新标签。</div> <div> </div> <div>$ git tag -d v0.1.2 # 删除标签</div> <div> </div> <div>参数d即delete的缩写,意为删除其后指定的标签。</div> <div> </div> <div>给指定的commit打标签</div> <div> </div> <div>打标签不必要在head之上,也可在之前的版本上打,这需要你知道某个提交对象的校验和(通过git log获取)。</div> <div> </div> <div># 补打标签</div> <div>$ git tag -a v0.1.1 9fbc3d0</div> <div> </div> <div>标签发布</div> <div> </div> <div>通常的git push不会将标签对象提交到git服务器,我们需要进行显式的操作:</div> <div> </div> <div>$ git push origin v0.1.2 # 将v0.1.2标签提交到git服务器</div> <div>$ git push origin –tags # 将本地所有标签一次性提交到git服务器</div> <div> </div> <div>注意:如果想看之前某个标签状态下的文件,可以这样操作</div> <div> </div> <div>1.git tag   查看当前分支下的标签</div> <div> </div> <div>2.git  checkout v0.21   此时会指向打v0.21标签时的代码状态,(但现在处于一个空的分支上)</div> <div> </div> <div>3. cat  test.txt   查看某个文件</div> <div> </div> <div>本文转载于:<a href="https://www.cnraksmart.com/210.html" target="_blank" rel="nofollow">https://www.cnraksmart.com/210.html</a></div> <div class="alert alert-success" role="alert"><p>来源:<code>https://www.cnblogs.com/subaomg/p/9875605.html</code></p></div></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/git" hreflang="zh-hans">git</a></div> <div class="field--item"><a href="/tag/gitqiehuanfenzhi" hreflang="zh-hans">git切换分支</a></div> <div class="field--item"><a href="/tag/gittijiaodaima" hreflang="zh-hans">git提交代码</a></div> <div class="field--item"><a href="/tag/kepu" hreflang="zh-hans">科普</a></div> </div> </div> Mon, 06 Apr 2020 19:43:17 +0000 醉酒当歌 3551289 at https://www.e-learn.cn git 远程分支和tag标签的操作 https://www.e-learn.cn/topic/3551090 <span>git 远程分支和tag标签的操作</span> <span><span lang="" about="/user/135" typeof="schema:Person" property="schema:name" datatype="">纵饮孤独</span></span> <span>2020-04-07 02:29:16</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"> <p>git远程分支操作:<br />1、创建远程分支<br />git push --set-upstream origin develop:develop2<br />在服务器创建远程分支devlop2,让本地的develop分支和develop2分支相互关联<br />2、把本地代码推送到远程分支上<br />git push origin develop:develop2<br />把本地的develop分支上的代码推送到远程develop2分支上<br />3、删除远程的分支<br />git push origin --delete develop2<br />删除远程的develop2分支<br />4、查看本地分支与远程分支之间的关系<br />git remote show origin<br />5、把远程服务器的代码拉取到本地<br />git pull origin develop2:develop<br />把远程develop2分组的代码拉起到本地develop分支<br />git pull和git push可以总结为下面的形式<br />git push origin srcBranch:DestBranch<br />git pull origin srcBranch:DestBranch<br />都是从srcBranch到DestBranch<br />6、git tag的操作<br />7、在当前分支的某个提交节点上创建一个Tag标签<br />git tag -a v1.0 -m 'v1.0 release'<br />创建一个v1.0的tag,注释是v1.0 release<br />8、查看标签的具体信息,显示标签对应哪个commitid<br />show tag v1.0<br />9、查看当前分支存在哪些tag<br />git tag<br />10、把标签推送到服务器<br />git push origin v1.0<br />git push origin refs/tags/v1.0:refs/tags/v1.0<br />将v1.0的tag推送到服务器<br />11、把本地全部存在的tag推送到服务器<br />git push origin --tags<br />12、其他人如何获取服务器上的标签<br />git pull<br />git fetch origin tag v1.0<br />执行git pull就会把服务器存在的tag标签拉取到本地<br />13、删除远程的tag<br />git push origin --delete tag v5.0<br />14、删除本地的tag<br />git tag -d v5.0</p> <p> </p> <div class="alert alert-success" role="alert"><p>来源:<code>https://www.cnblogs.com/kebibuluan/p/10293300.html</code></p></div></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/origin" hreflang="zh-hans">origin</a></div> <div class="field--item"><a href="/tag/git" hreflang="zh-hans">git</a></div> <div class="field--item"><a href="/tag/gittijiaodaima" hreflang="zh-hans">git提交代码</a></div> </div> </div> Mon, 06 Apr 2020 18:29:16 +0000 纵饮孤独 3551090 at https://www.e-learn.cn git 实践(一) pull的使用 https://www.e-learn.cn/topic/3551057 <span>git 实践(一) pull的使用</span> <span><span lang="" about="/user/210" typeof="schema:Person" property="schema:name" datatype="">限于喜欢</span></span> <span>2020-04-07 02:23:09</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"> <div> <h1>前言</h1> <p>工作中,我们会用到<strong>git pull</strong>来从远程仓库"同步"代码,通常有三种方式;</p> <blockquote> <p>git pull origin &lt;remote_branch&gt;:&lt;local_branch&gt;<br /> git pull origin &lt;remote_branch&gt;<br /> git pull</p> </blockquote> <p>这三种用法充分诠释了什么是<strong>简即繁</strong>,<strong>繁即简</strong>;看上去简单的,往往背后蕴藏玄机;</p> <div class="_2Uzcx_"><button class="VJbwyy" type="button"></button> <pre>测试环境: 本地分支:master和dev 远程分支:master和dev $ git branch -a * dev master remotes/origin/HEAD -&gt; origin/master remotes/origin/dev remotes/origin/master </pre> </div> <h2>1.git pull origin &lt;remote_branch&gt;:&lt;local_branch&gt;</h2> <p>这种用法写起来最为繁琐,但最好理解:</p> <blockquote> <p>场景:当本地的当前分支不是local_branch;<br /> 作用:将远程分支拉取到指定本地分支;</p> </blockquote> <p>例如:当前分支是dev,但是你想把远程master”同步”到本地master,但又不想使checkout切换到master分支;<br /> 这时你就可以使用git pull origin master:master</p> <div class="_2Uzcx_"><button class="VJbwyy" type="button"></button> <pre>zhangchangzhi@ZBXXXX /e/02.Workspace-test/gitTest (dev) $ git pull origin master:master From https://github.com/jinxintang/gitTest a09fdc4..941758f master -&gt; master Already up-to-date. </pre> </div> <p>从上述代码可以看到,我当前分支为<strong>dev</strong>,但执行"同步”操作的却是在master分支;</p> <h2>2.git pull origin &lt;remote_branch&gt;</h2> <p>有了上面的例子,这种使用方法的场景和作用就好理解了:</p> <blockquote> <p>场景:在当前分支上进行同步操作;<br /> 作用:将指定远程分支同步到当前本地分支;</p> </blockquote> <p>废话不说,上代码:</p> <div class="_2Uzcx_"><button class="VJbwyy" type="button"></button> <pre>zhangchangzhi@ZBXXX /e/02.Workspace-test/gitTest (dev) $ git pull origin master From https://github.com/jinxintang/gitTest * branch master -&gt; FETCH_HEAD Already up-to-date. </pre> </div> <p>把远程master分支同步到HEAD分支(HEAD分支指向当前位置);</p> <h2>3.git pull</h2> <p>这种写法最简单,也最常用,但是隐含的知识也是最多的;</p> <blockquote> <p>场景:本地分支已经和想要拉取的分支建立了“关联”关系;<br /> 作用:拉取所有远程分支的新版本"坐标",并同步当前分支的本地代码(具体根据关联分支而定)</p> </blockquote> <h3>什么是"关联"分支?</h3> <p>首先我们先使用<code>git branch -vv</code> 查看一下目前分支的“关联”情况;</p> <div class="_2Uzcx_"><button class="VJbwyy" type="button"></button> <pre>$ git branch -vv * dev 1a1b215 [origin/dev] Merge branch 'master' of https://github.com/jinxintang/gitTest into dev master a09fdc4 [origin/master] create pull </pre> </div> <p>可以看到我们的本地的dev关联的是远程(origin)的dev,本地的master关联的是远程(origin)的master;<br /> 那么这种关联是如何建立、是否可以修改呢;<br /> 配置本地分支与远程分支的三种方法:<br /> 1.检出时建立关联关系:<code>git checkout -b dev origin/dev</code><br /> 当我们检查时,git会自动为我们检出的分支和远程分支建立关联关系;<br /> 2.提交时配置关联关系:<code>git push -u origin &lt;remote_branch&gt;</code>或<code>git push --set-upstream origin &lt;remote_branch&gt;</code></p> <div class="_2Uzcx_"><button class="VJbwyy" type="button"></button> <pre>zhangchangzhi@ZB-PF0SB6DQ MINGW64 /e/02.Workspace-test/gitTest (dev_zcz) $ git branch -vv * dev_zcz 3b7001a [origin/dev] cm master a09fdc4 [origin/master] create pull zhangchangzhi@ZB-PF0SB6DQ MINGW64 /e/02.Workspace-test/gitTest (dev_zcz) $ git push -u origin dev_zcz Everything up-to-date Branch dev_zcz set up to track remote branch dev_zcz from origin. zhangchangzhi@ZB-PF0SB6DQ MINGW64 /e/02.Workspace-test/gitTest (dev_zcz) $ git branch -vv * dev_zcz 3b7001a [origin/dev_zcz] cm master a09fdc4 [origin/master] create pull </pre> </div> <p>通过上面的例子可以看到push前dev_zcz关联的是origin/dev,执行push -u 后管理分支改为origin/dev_zcz<br /> 注:默认配置下,提交时本地分支需和远程分支同名;</p> <p>3.更改git/config文件:<code>git branch --set-upstream-to=&lt;remote_branch&gt;</code></p> <div class="_2Uzcx_"><button class="VJbwyy" type="button"></button> <pre>zhangchangzhi@ZB-PF0SB6DQ MINGW64 /e/02.Workspace-test/gitTest (dev_zcz) $ git branch --set-upstream-to=origin/zcz Branch dev_zcz set up to track local branch origin/zcz. zhangchangzhi@ZB-PF0SB6DQ MINGW64 /e/02.Workspace-test/gitTest (dev_zcz) $ git branch -vv * dev_zcz 3b7001a [origin/zcz] cm master a09fdc4 [origin/master] create pull origin/zcz 3b7001a [dev_zcz] cm </pre> </div> <p>无论使用上述那种方法,本地分支和远程分支的“关联”最终都会写到config文件;</p> <div class="_2Uzcx_"><button class="VJbwyy" type="button"></button> <pre>zhangchangzhi@ZB-PF0SB6DQ MINGW64 /e/02.Workspace-test/gitTest/.git (GIT_DIR!) $ cat config [core] repositoryformatversion = 0 filemode = false bare = false logallrefupdates = true symlinks = false ignorecase = true [remote "origin"] url = https://github.com/jinxintang/gitTest.git fetch = +refs/heads/*:refs/remotes/origin/* [branch "master"] remote = origin merge = refs/heads/master [branch "dev_zcz"] remote = . merge = refs/heads/origin/zcz [branch "origin/zcz"] remote = . merge = refs/heads/dev_zcz </pre> </div> <p>注:本项目的配置信息存放目录:项目所在目录/.git/config<br /> 看完这三种配置关联分支的方法,想必大家已经对“关联分支”有了一定了解;</p> <blockquote> <p>关联分支:在git中表现为upstream,无论是使用push -u 或是 git branch --set-upstream-to方法,均会将这种对应关系写入.git/config配置文件,如果一个本地分支没有关联分支,则无法执行 git push 或 git pull指令;</p> </blockquote> <p>没有"关联"分支的情况下,使用push会先让你设置一个upstream branch.</p> <div class="_2Uzcx_"><button class="VJbwyy" type="button"></button> <pre>zhangchangzhi@ZB-PF0SB6DQ MINGW64 /e/02.Workspace-test/gitTest (dev_no_upstream) $ git branch -vv * dev_no_upstream 3b7001a cm dev_zcz 3b7001a [origin/zcz] cm master a09fdc4 [origin/master] create pull origin/zcz 3b7001a [dev_zcz] cm zhangchangzhi@ZB-PF0SB6DQ MINGW64 /e/02.Workspace-test/gitTest (dev_no_upstream) $ git push fatal: The current branch dev_no_upstream has no upstream branch. To push the current branch and set the remote as upstream, use git push --set-upstream origin dev_no_upstream </pre> </div> <p>那么建立了一个关联分支,是否就一定能使用git push呢?请阅读&lt;git 实践(二)push的使用&gt;</p> </div> <p><br /><br /></p> <div class="alert alert-success" role="alert"><p>来源:<code>https://www.cnblogs.com/jianxian/p/12650939.html</code></p></div></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/origin" hreflang="zh-hans">origin</a></div> <div class="field--item"><a href="/tag/git" hreflang="zh-hans">git</a></div> <div class="field--item"><a href="/tag/master" hreflang="zh-hans">master</a></div> <div class="field--item"><a href="/tag/gitqiehuanfenzhi" hreflang="zh-hans">git切换分支</a></div> <div class="field--item"><a href="/tag/gittijiaodaima" hreflang="zh-hans">git提交代码</a></div> <div class="field--item"><a href="/tag/dev" hreflang="zh-hans">dev</a></div> <div class="field--item"><a href="/tag/branch" hreflang="zh-hans">branch</a></div> <div class="field--item"><a href="/tag/test" hreflang="zh-hans">test</a></div> </div> </div> Mon, 06 Apr 2020 18:23:09 +0000 限于喜欢 3551057 at https://www.e-learn.cn Git 分支 - 远程分支 https://www.e-learn.cn/topic/3550884 <span>Git 分支 - 远程分支</span> <span><span lang="" about="/user/149" typeof="schema:Person" property="schema:name" datatype="">痞子三分冷</span></span> <span>2020-04-07 01:04:03</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"> <p>Git 分支 - 远程分支<br /> 远程分支<br /> 远程分支(remote branch)是对远程仓库中的分支的索引。它们是一些无法移动的本地分支;只有在 Git 进行网络交互时才会更新。远程分支就像是书签,提醒着你上次连接远程仓库时上面各分支的位置。</p> <p>我们用 (远程仓库名)/(分支名) 这样的形式表示远程分支。比如我们想看看上次同 origin 仓库通讯时 master 分支的样子,就应该查看 origin/master 分支。如果你和同伴一起修复某个问题,但他们先推送了一个 iss53 分支到远程仓库,虽然你可能也有一个本地的 iss53 分支,但指向服务器上最新更新的却应该是 origin/iss53 分支。</p> <p>可能有点乱,我们不妨举例说明。假设你们团队有个地址为 git.ourcompany.com 的 Git 服务器。如果你从这里克隆,Git 会自动为你将此远程仓库命名为 origin,并下载其中所有的数据,建立一个指向它的 master 分支的指针,在本地命名为 origin/master,但你无法在本地更改其数据。接着,Git 建立一个属于你自己的本地 master 分支,始于 origin 上 master 分支相同的位置,你可以就此开始工作(见图 3-22):</p> <p>图 3-22. 一次 Git 克隆会建立你自己的本地分支 master 和远程分支 origin/master,并且将它们都指向 origin 上的 master 分支。<br /> 如果你在本地 master 分支做了些改动,与此同时,其他人向 git.ourcompany.com 推送了他们的更新,那么服务器上的 master 分支就会向前推进,而与此同时,你在本地的提交历史正朝向不同方向发展。不过只要你不和服务器通讯,你的 origin/master 指针仍然保持原位不会移动(见图 3-23)。</p> <p>图 3-23. 在本地工作的同时有人向远程仓库推送内容会让提交历史开始分流。<br /> 可以运行 git fetch origin 来同步远程服务器上的数据到本地。该命令首先找到 origin 是哪个服务器(本例为 git.ourcompany.com),从上面获取你尚未拥有的数据,更新你本地的数据库,然后把 origin/master 的指针移到它最新的位置上(见图 3-24)。</p> <p>图 3-24. git fetch 命令会更新 remote 索引。<br /> 为了演示拥有多个远程分支(在不同的远程服务器上)的项目是如何工作的,我们假设你还有另一个仅供你的敏捷开发小组使用的内部服务器 git.team1.ourcompany.com。可以用第二章中提到的 git remote add 命令把它加为当前项目的远程分支之一。我们把它命名为 teamone,以便代替完整的 Git URL 以方便使用(见图 3-25)。</p> <p>图 3-25. 把另一个服务器加为远程仓库<br /> 现在你可以用 git fetch teamone 来获取小组服务器上你还没有的数据了。由于当前该服务器上的内容是你 origin 服务器上的子集,Git 不会下载任何数据,而只是简单地创建一个名为 teamone/master 的远程分支,指向 teamone 服务器上 master 分支所在的提交对象 31b8e(见图 3-26)。</p> <p>图 3-26. 你在本地有了一个指向 teamone 服务器上 master 分支的索引。<br /> 推送本地分支<br /> 要想和其他人分享某个本地分支,你需要把它推送到一个你拥有写权限的远程仓库。你创建的本地分支不会因为你的写入操作而被自动同步到你引入的远程服务器上,你需要明确地执行推送分支的操作。换句话说,对于无意分享的分支,你尽管保留为私人分支好了,而只推送那些协同工作要用到的特性分支。</p> <p>如果你有个叫 serverfix 的分支需要和他人一起开发,可以运行 git push (远程仓库名) (分支名):</p> <p>$ git push origin serverfix<br /> Counting objects: 20, done.<br /> Compressing objects: 100% (14/14), done.<br /> Writing objects: 100% (15/15), 1.74 KiB, done.<br /> Total 15 (delta 5), reused 0 (delta 0)<br /> To git@github.com:schacon/simplegit.git</p> <ul><li>[new branch] serverfix -&gt; serverfix<br /> 这里其实走了一点捷径。Git 自动把 serverfix 分支名扩展为 refs/heads/serverfix:refs/heads/serverfix,意为“取出我在本地的 serverfix 分支,推送到远程仓库的 serverfix 分支中去”。我们将在第九章进一步介绍 refs/heads/ 部分的细节,不过一般使用的时候都可以省略它。也可以运行 git push origin serverfix:serverfix 来实现相同的效果,它的意思是“上传我本地的 serverfix 分支到远程仓库中去,仍旧称它为 serverfix 分支”。通过此语法,你可以把本地分支推送到某个命名不同的远程分支:若想把远程分支叫作 awesomebranch,可以用 git push origin serverfix:awesomebranch 来推送数据。</li> </ul><p>接下来,当你的协作者再次从服务器上获取数据时,他们将得到一个新的远程分支 origin/serverfix,并指向服务器上 serverfix 所指向的版本:</p> <p>$ git fetch origin<br /> remote: Counting objects: 20, done.<br /> remote: Compressing objects: 100% (14/14), done.<br /> remote: Total 15 (delta 5), reused 0 (delta 0)<br /> Unpacking objects: 100% (15/15), done.<br /> From git@github.com:schacon/simplegit</p> <ul><li>[new branch] serverfix -&gt; origin/serverfix<br /> 值得注意的是,在 fetch 操作下载好新的远程分支之后,你仍然无法在本地编辑该远程仓库中的分支。换句话说,在本例中,你不会有一个新的 serverfix 分支,有的只是一个你无法移动的 origin/serverfix 指针。</li> </ul><p>如果要把该远程分支的内容合并到当前分支,可以运行 git merge origin/serverfix。如果想要一份自己的 serverfix 来开发,可以在远程分支的基础上分化出一个新的分支来:</p> <p>$ git checkout -b serverfix origin/serverfix<br /> Branch serverfix set up to track remote branch serverfix from origin.<br /> Switched to a new branch 'serverfix'<br /> 这会切换到新建的 serverfix 本地分支,其内容同远程分支 origin/serverfix 一致,这样你就可以在里面继续开发了。</p> <p>跟踪远程分支<br /> 从远程分支 checkout 出来的本地分支,称为 跟踪分支 (tracking branch)。跟踪分支是一种和某个远程分支有直接联系的本地分支。在跟踪分支里输入 git push,Git 会自行推断应该向哪个服务器的哪个分支推送数据。同样,在这些分支里运行 git pull 会获取所有远程索引,并把它们的数据都合并到本地分支中来。</p> <p>在克隆仓库时,Git 通常会自动创建一个名为 master 的分支来跟踪 origin/master。这正是 git push 和 git pull 一开始就能正常工作的原因。当然,你可以随心所欲地设定为其它跟踪分支,比如 origin 上除了 master 之外的其它分支。刚才我们已经看到了这样的一个例子:git checkout -b [分支名] [远程名]/[分支名]。如果你有 1.6.2 以上版本的 Git,还可以用 --track 选项简化:</p> <p>$ git checkout --track origin/serverfix<br /> Branch serverfix set up to track remote branch serverfix from origin.<br /> Switched to a new branch 'serverfix'<br /> 要为本地分支设定不同于远程分支的名字,只需在第一个版本的命令里换个名字:</p> <p>$ git checkout -b sf origin/serverfix<br /> Branch sf set up to track remote branch serverfix from origin.<br /> Switched to a new branch 'sf'<br /> 现在你的本地分支 sf 会自动将推送和抓取数据的位置定位到 origin/serverfix 了。</p> <p>删除远程分支<br /> 如果不再需要某个远程分支了,比如搞定了某个特性并把它合并进了远程的 master 分支(或任何其他存放稳定代码的分支),可以用这个非常无厘头的语法来删除它:git push [远程名] :[分支名]。如果想在服务器上删除 serverfix 分支,运行下面的命令:</p> <p>$ git push origin :serverfix<br /> To git@github.com:schacon/simplegit.git</p> <ul><li>[deleted] serverfix<br /> 咚!服务器上的分支没了。你最好特别留心这一页,因为你一定会用到那个命令,而且你很可能会忘掉它的语法。有种方便记忆这条命令的方法:记住我们不久前见过的 git push [远程名] [本地分支]:[远程分支] 语法,如果省略 [本地分支],那就等于是在说“在这里提取空白然后把它变成[远程分支]”。</li> </ul><div class="alert alert-success" role="alert"><p>来源:<code>https://www.cnblogs.com/ITniu/p/7426795.html</code></p></div></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/origin" hreflang="zh-hans">origin</a></div> <div class="field--item"><a href="/tag/git" hreflang="zh-hans">git</a></div> <div class="field--item"><a href="/tag/master" hreflang="zh-hans">master</a></div> <div class="field--item"><a href="/tag/gitqiehuanfenzhi" hreflang="zh-hans">git切换分支</a></div> <div class="field--item"><a href="/tag/gittijiaodaima" hreflang="zh-hans">git提交代码</a></div> <div class="field--item"><a href="/tag/branch" hreflang="zh-hans">branch</a></div> <div class="field--item"><a href="/tag/remote" hreflang="zh-hans">remote</a></div> </div> </div> Mon, 06 Apr 2020 17:04:03 +0000 痞子三分冷 3550884 at https://www.e-learn.cn 这篇关于git的使用方法你一定要看 https://www.e-learn.cn/topic/3549574 <span>这篇关于git的使用方法你一定要看</span> <span><span lang="" about="/user/48" typeof="schema:Person" property="schema:name" datatype="">白昼怎懂夜的黑</span></span> <span>2020-04-06 17:09:06</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"> <p>以下的介绍只是基于我个人对于git的理解,并且可能生编硬造了一些不完全符合git说法的词语。目的只是为了让git通俗化,使初学者也能大概了解如何快速上手git。</p> <p>同时,下面所有讨论,我们都假设只使用一个分支,也就是主分支master的情况,虽然这种作法并不符合git规范,但是现实情况中绝大部分用户是直接在master分支上进行工作的,所以在这里我们不去引入更加复杂的各种分支的情况,也不涉及标签tag的操作,只讲在最简单的主分支上如何回退。</p> <h4>3个步骤</h4> <p>正常情况下,我们的工作流就是3个步骤</p> <pre><code>git add . git commit -m "comment" git push </code></pre> <h4>4个区</h4> <p>git之所以令人费解,主要是它相比于svn等等传统的版本管理工具,多引入了一个暂存区(Stage)的概念,就因为多了这一个概念,而使很多人疑惑。其实,在初学者来说,每个区具体怎么工作的,我们完全不需要关心,而只要知道有这么4个区就够了:</p> <ul><li>工作区(Working Area)</li> <li>暂存区(Stage)</li> <li>本地仓库(Local Repository)</li> <li>远程仓库(Remote Repository)</li> </ul><h4>5种状态</h4> <p>以上4个区,进入每一个区成功之后会产生一个状态,再加上最初始的一个状态,一共是5种状态。以下我们把这5种状态分别命名为:</p> <ul><li>未修改(Origin)</li> <li>已修改(Modified)</li> <li>已暂存(Staged)</li> <li>已提交(Committed)</li> <li>已推送(Pushed)</li> </ul><h4>检查修改</h4> <p>了解了基本概念之后,我们来谈一谈犯错误之后如何撤销的问题。首先,我们要了解如何检查这3个步骤当中每一个步骤修改了什么,然后才好判断有没有修改成功。检查修改的二级命令都相同,都是diff,只是参数有所不同。</p> <p><strong>已修改,未暂存</strong></p> <pre><code>git diff </code></pre> <p>首先,我们来看一下,如果我们只是简单地在浏览器里保存了一下文件,但是还没有做git add .之前,我们如何检查有哪些修改。我们先随便拿一个文件来做一下实验。</p> <p>我们在文件开头的第2行胡乱加了4个数字1234,存盘,这时文件进入了已修改状态,但是还没有进入暂存区,我们运行git diff,结果如下</p> <pre><code>$ git diff diff --git a/app/Http/Controllers/Admin/VideoController.php b/app/Http/Controllers/Admin/VideoController.php index 5a3a49d..757c775 100644 --- a/app/Http/Controllers/Admin/VideoController.php +++ b/app/Http/Controllers/Admin/VideoController.php @@ -3,7 +3,7 @@ * Created by PhpStorm. * User: cyw * Date: 2019/6/7 - * Time: 12:11 + * Time: 12:111234 */ namespace App\Http\Controllers\Admin; </code></pre> <p>git diff的结果告诉我们哪些文件已经做了哪些修改。</p> <p><strong>已暂存,未提交</strong></p> <pre><code>git diff --cached </code></pre> <p>现在我们把修改放入暂存区看一下。先执行git add .,然后执行git diff,你会发现没有任何结果。</p> <p>这说明git diff这个命令只检查我们的工作区和暂存区之间的差异,如果我们想看到暂存区和本地仓库之间的差异,就需要加一个参数git diff --cached:</p> <pre><code>diff --git a/index.md b/index.md index 73ff1ba..1066758 100644 --- a/index.md +++ b/index.md &lt;a href='http://www.jobbole.com/members/li754132448'&gt;@@&lt;/a&gt; -1,5 +1,5 &lt;a href='http://www.jobbole.com/members/li754132448'&gt;@@&lt;/a&gt; --- -layout: main +1234layout: main color: black --- </code></pre> <p>这时候我们看到的差异是暂存区和本地仓库之间的差异。</p> <p><strong>已提交,未推送</strong></p> <pre><code>git diff master origin/master </code></pre> <p>现在,我们把修改从暂存区提交到本地仓库,再看一下差异。先执行git commit,然后再执行git diff --cached,没有差异,执行git diff master origin/master,可以看到差异:</p> <p>在这里,master就是你的本地仓库,而origin/master就是你的远程仓库,master是主分支的意思,因为我们都在主分支上工作,所以这里两边都是master,而origin就代表远程。</p> <p><strong>撤销修改</strong></p> <p>了解清楚如何检查各种修改之后,我们开始尝试各种撤销操作。</p> <p><strong>已修改,未暂存</strong></p> <p>如果我们只是在编辑器里修改了文件,但还没有执行git add .,这时候我们的文件还在工作区,并没有进入暂存区,我们可以用:</p> <pre><code>git checkout . </code></pre> <p>或者</p> <pre><code>git reset --hard </code></pre> <p>来进行撤销操作。</p> <p>可以看到,在执行完git checkout .之后,修改已被撤销,git diff没有任何内容了。</p> <pre><code>一对反义词 git add .的反义词是git checkout .。 做完修改之后,如果你想向前走一步,让修改进入暂存区,就执行git add ., 如果你想向后退一步,撤销刚才的修改,就执行git checkout . </code></pre> <p><strong>已暂存,未提交</strong></p> <p>你已经执行了git add .,但还没有执行git commit -m "comment"。这时候你意识到了错误,想要撤销,你可以执行:</p> <pre><code>git reset git checkout . </code></pre> <p>或者</p> <pre><code>git reset --hard </code></pre> <p>git reset只是把修改退回到了git add .之前的状态,也就是说文件本身还处于已修改未暂存状态,你如果想退回未修改状态,还需要执行git checkout .。</p> <p>或许你已经注意到了,以上两个步骤都可以用同一个命令git reset --hard来完成。是的,就是这个强大的命令,可以一步到位地把你的修改完全恢复到未修改的状态。</p> <p><strong>已提交,未推送</strong></p> <p>你的手太快,你既执行了git add .,又执行了git commit,这时候你的代码已经进入了你的本地仓库,然而你后悔了,怎么办?不要着急,还有办法。</p> <pre><code>git reset --hard origin/master </code></pre> <p>还是这个git reset --hard命令,只不过这次多了一个参数origin/master,正如我们上面讲过的,origin/master代表远程仓库,既然你已经污染了你的本地仓库,那么就从远程仓库把代码取回来吧。</p> <p><strong>已推送</strong></p> <p>很不幸,你的手实在是太快了,你既git add了,又git commit了,并且还git push了,这时你的代码已经进入远程仓库。如果你想恢复的话,还好,由于你的本地仓库和远程仓库是等价的,你只需要先恢复本地仓库,再强制push到远程仓库就好了:</p> <pre><code>git reset --hard HEAD^ git push -f </code></pre> <p>以上4种状态的撤销我们都用到了同一个命令git reset --hard,前2种状态的用法甚至完全一样,所以只要掌握了git reset --hard这个命令的用法,从此你再也不用担心提交错误了。</p> <blockquote> <p>文源网络,仅供学习之用,如有侵权,联系删除。</p> <p>我将优质的技术文章和经验总结都汇集在了我的公众号【Java圈子】里。</p> <p>为方便大家学习,我整理了一套学习资料,涵盖Java虚拟机、spring框架、Java线程、数据结构、设计模式等等,免费提供给热爱Java的同学! 更有学习交流群,多交流问题才能更快进步~</p> </blockquote> <p><img alt="file" class="b-lazy" data-src="https://oscimg.oschina.net/oscnet/up-d94851755e6483acd4027243953996689fa.JPEG" data-original="https://oscimg.oschina.net/oscnet/up-d94851755e6483acd4027243953996689fa.JPEG" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /></p> <div class="alert alert-success" role="alert"><p>来源:<code>oschina</code></p><p>链接:<code>https://my.oschina.net/u/4477286/blog/3214481</code></p></div></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/git" hreflang="zh-hans">git</a></div> <div class="field--item"><a href="/tag/master" hreflang="zh-hans">master</a></div> <div class="field--item"><a href="/tag/gittijiaodaima" hreflang="zh-hans">git提交代码</a></div> <div class="field--item"><a href="/tag/reset" hreflang="zh-hans">reset</a></div> <div class="field--item"><a href="/tag/origin" hreflang="zh-hans">origin</a></div> </div> </div> Mon, 06 Apr 2020 09:09:06 +0000 白昼怎懂夜的黑 3549574 at https://www.e-learn.cn 为Xcode配置Git和Github https://www.e-learn.cn/topic/3547805 <span>为Xcode配置Git和Github</span> <span><span lang="" about="/user/99" typeof="schema:Person" property="schema:name" datatype="">牧云@^-^@</span></span> <span>2020-04-06 07:05:49</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"> <p>Xcode、Git和Github是三个伟大的编程工具。本文记录一下如何在Xcode中使用Git作为源代码控制工具,以及如何将本地的Git仓库和远程Github上的仓库集成起来。</p> <h3><a name="t1" rel="nofollow" id="t1"></a>1. 如何为新建的Xcode项目使用Git</h3> <p>Xcode4开始,就已经将Git作为内置的源代码控制(Source Control)工具了,所以为新建的项目使用git来管理是很方便的。</p> <p>在新建项目向导中,可以直接选择Git作为源代码控制工具,完成项目新建向导后,就在本地项目目下新建了一个仓库。</p> <h3><a name="t2" rel="nofollow" id="t2"></a>2. 如何为已经存在的项目使用Git</h3> <p>如果已经存在了一个Project,想要为它使用Git,可以利用Git的命令行来操作。</p> <p>假设该项目的根目录是: ~/Documents/Projects/ProjectA</p> <p>(1) 在终端中先进入该目录:</p> <pre>cd ~/Documents/Projects/ProjectA</pre> <p>(2) 在该目录初始化Git仓库:</p> <pre>git init</pre> <p> </p> <p>(3) 注意,这时一定不要着急将目录下的所有文件都添加进来,先手工设置一些针对Mac OS X上的无用文件的排除(exclude),在项目根目录(ProjectA)下新建.gitignore文件,在该文件中添加如下排除规则:</p> <pre># 排除build目录 build/* # Exclude temp nibs and swap files # 排除nib临时文件和交换文件 *~.nib *.swp # 排除OS X的文件夹显示属性目录 .DS_Store # 排除xcode3 xcode4的用户自定义设置文件 *.mode1 *.mode1v3 *.mode2v3 *.perspective *.perspectivev3 *.pbxuser xcuserdata </pre> <p>上面的规则只是大多数开发者都不需要进行版本控制的文件,还可以根据实际需要添加其它排除规则. 关于.gitignore更多的信息可以<a href="https://www.google.com/#hl=en&amp;sugexp=les%3B&amp;gs_rn=5&amp;gs_ri=psy-ab&amp;tok=P95TMLPbhn5iFZCYLrXMgQ&amp;cp=7&amp;gs_id=b1&amp;xhr=t&amp;q=xcode+.gitignore&amp;es_nrs=true&amp;pf=p&amp;newwindow=1&amp;output=search&amp;sclient=psy-ab&amp;oq=xcode+.&amp;gs_l=&amp;pbx=1&amp;bav=on.2,or.r_cp.r_qf.&amp;bvm=bv.43287494,d.aGc&amp;fp=9c180fe5413d45aa&amp;biw=1240&amp;bih=699" target="_blank" rel="nofollow">google之</a>。</p> <p>(4) 向git仓库中添加源文件</p> <p>继续在终端命令行中,进入ProjectA下,</p> <pre>git add . git commit -m "Initial commit" </pre> <p>然后重启Xcode,就可以在Orgnizer视图中的“Repositories”选项卡界面下看到ProjectA的仓库了,并且已经完成了源代码的初次提交。此后,就可以进行源代码在本地仓库的版本控制了。</p> <h3><a name="t3" rel="nofollow" id="t3"></a>3. 如何将Xcode的本地Git仓库与Github的远程仓库集成?</h3> <p>Github的理念源自于Git,但是与Git相比已经有了一些异化的功能特性(比如<a href="https://help.github.com/articles/using-pull-requests" target="_blank" rel="nofollow">Pull Request</a>),所以二者并非完全一致的。但是从版本控制方面来说,差别不大。所以利用Xcode内置的Git管理功能即可与Github连接,而无需额外安装Github客户端。</p> <p>Github的仓库地址有两种方式:</p> <p>一种是SSH连接方式,形式为:git@github.com:Hao-Wu/ProjecA.git</p> <p>一种是HTTP形式,形式为:https://github.com/Hao-Wu/ProjectA.git</p> <p>这两种仓库地址使用的认证方式也不一样。对于SSH连接,使用非对称公钥认证方法;对于HTTP连接,使用帐号密码认证方式。</p> <h4><a name="t4" rel="nofollow" id="t4"></a>3.1 使用SSH方式</h4> <pre># 检查本机是否已经存在ssh公钥 $ cd ~/.ssh </pre> <p>如果以前已经生成过ssh密钥对,那么就存在这个.ssh目录,目录下有id_rsa.pub公钥文件。如果还记得这个密钥对生成的细节(比如passphrase),就可以直接拿来用;否则就再多花费半分钟时间,生成新的密钥对(记得先备份旧的密钥文件,说不定其它什么项目或程序在使用):</p> <pre>#创建新的SSH密钥对 $ ssh-keygen -t rsa -C "your_email@example.com" Enter passphrase (empty for no passphrase): [输入密码] Enter same passphrase again: [再次输入密码] </pre> <p>到这里,SSH密钥对就生成了,接下来将id_rsa.pub文件用文本编辑器打开,将其中的全部字符串拷贝,并粘贴到web版的github.com中<a href="https://github.com/settings/ssh" target="_blank" rel="nofollow">SSH公钥设置</a>内。这样Xcode就可以利用SSH认证与github连接。先测试一下:</p> <pre>$ ssh -T git@github.com</pre> <p>本机就会向github发出一个连接请求,随后Mac OS会弹出一些安全认证和请求获取授权的提示框,要选择允许。如果github的服务器返回:</p> <blockquote> <pre>Hi username! You've successfully authenticated, but GitHub does not provide shell access. </pre> </blockquote> <p>这就说明本地的git已经能够成功与github服务器通信了。(不用担心上面的访问被拒绝的提示)。在确定能够与github服务器连接后,即可为ProjectA的本地git仓库添加远程地址:</p> <p>依次点击,  Orgnizer –&gt; Repositories –&gt; ProjectA –&gt; Remotes –&gt; Add Remote</p> <p>输入ProjectA在github上的地址(如果没有就先在github.com的仓库管理页面新建一个名为ProjectA的仓库):git@github.com:Hao-Wu/ProjecA.git</p> <p>Username与Password不用输入,关闭Orgnizer视图。在File –&gt; Source Control中即可将本地仓库的代码Push到github上了。</p> <h3><a name="t5" rel="nofollow" id="t5"></a>3.2 使用HTTP方式</h3> <p>使用http认证方式省去了生成SSH证书的步骤,但是在每次提交时都需要输入github的帐号和密码。</p> <p>类似地,依次点击 Orgnizer –&gt; Repositories –&gt; ProjectA –&gt; Remotes –&gt; Add Remote</p> <p>输入ProjectA在github的http形式的地址:https://github.com/Hao-Wu/ProjectA.git</p> <p>在UserName和Pasword中分别输入github网站登录的用户名和密码 (用户名不是邮箱形式)。关闭Orgnizer视图,File –&gt; Source Control –&gt; Push, 即可向github中push本地仓库的代码。这个过程可能需要重新输入一遍github的用户名和密码。</p> <div class="alert alert-success" role="alert"><p>来源:<code>https://www.cnblogs.com/W-Kr/p/5382486.html</code></p></div></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/xcode" hreflang="zh-hans">xcode</a></div> <div class="field--item"><a href="/tag/ssh" hreflang="zh-hans">ssh</a></div> <div class="field--item"><a href="/tag/git" hreflang="zh-hans">git</a></div> <div class="field--item"><a href="/tag/gittijiaodaima" hreflang="zh-hans">git提交代码</a></div> <div class="field--item"><a href="/tag/cangku" hreflang="zh-hans">仓库</a></div> </div> </div> Sun, 05 Apr 2020 23:05:49 +0000 牧云@^-^@ 3547805 at https://www.e-learn.cn 分布式版本控制系统(git分支管理) https://www.e-learn.cn/topic/3546561 <span>分布式版本控制系统(git分支管理)</span> <span><span lang="" about="/user/160" typeof="schema:Person" property="schema:name" datatype="">强颜欢笑</span></span> <span>2020-04-06 00:47:12</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><h4>1,分支管理</h4> <p>分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,立刻提交,由于代码还没有写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的风险。<br />现在有了分支,就不能怕了,你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,在一次性合并到原来的分支上,这样,既安全,又不影响别人工作。</p> <p>Git的分支与其他版本控制系统不同,无论创建,切换和删除分支,Git在1秒钟之内就能完成!无论你的版本库是1个文件还是1万个文件。</p> <h4>2,创建与合并分支</h4> <p>在版本回退里,我们已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支(master分支),HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。</p> <p>① 一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD执行maser,就能确定当前分支,以及当前分支的提交点,每次提交,master分支都会向前一步:<br /><img alt="分布式版本控制系统(git分支管理)" class="b-lazy" data-src="https://s4.51cto.com/images/blog/202004/05/cb232fbe6407f1e80fe053b9b8ab929d.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" data-original="https://s4.51cto.com/images/blog/202004/05/cb232fbe6407f1e80fe053b9b8ab929d.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><br />② 当我们创建新的分支,例如dev时,Git创建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:<br /><img alt="分布式版本控制系统(git分支管理)" class="b-lazy" data-src="https://s4.51cto.com/images/blog/202004/05/5c2dc833aab5e79e676c767ab92e7398.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" data-original="https://s4.51cto.com/images/blog/202004/05/5c2dc833aab5e79e676c767ab92e7398.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><br />可以看到,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化。</p> <p>③ 不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:<br /><img alt="分布式版本控制系统(git分支管理)" class="b-lazy" data-src="https://s4.51cto.com/images/blog/202004/05/0efdfb0cd1bc61b3fe3768e7ebd81a07.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" data-original="https://s4.51cto.com/images/blog/202004/05/0efdfb0cd1bc61b3fe3768e7ebd81a07.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /></p> <p>④ 假如我们在dev上的工作完成了,就可以把dev合并到master上。Git合并很简单,就是把master指向dev的当前提交,就完成了合并:<br /><img alt="分布式版本控制系统(git分支管理)" class="b-lazy" data-src="https://s4.51cto.com/images/blog/202004/05/e6309ada805453509e34cf8714891f10.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" data-original="https://s4.51cto.com/images/blog/202004/05/e6309ada805453509e34cf8714891f10.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><br />所以Git合并分支也很快,就改改指针,工作区内容不变。</p> <p>⑤ 合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,我们就剩下了一条master分支:<br /><img alt="分布式版本控制系统(git分支管理)" class="b-lazy" data-src="https://s4.51cto.com/images/blog/202004/05/cdfdcd68bf6b8cfc708ebfdb02574434.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" data-original="https://s4.51cto.com/images/blog/202004/05/cdfdcd68bf6b8cfc708ebfdb02574434.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /></p> <p>下面开始进行实践:<br />首先,我们创建dev分支,然后切换到dev分支:</p> <pre><code>[jonson@localhost mygit]$ git checkout -b dev Switched to a new branch 'dev' #git checkout命令加上-b参数表示创建并切换,相当于以下两条命令: $ git branch dev $ git checkout dev</code></pre> <p>然后,用git branch命令查看当前分支:</p> <pre><code>[jonson@localhost mygit]$ git branch * dev master #git branch命令会列出所有分支,当前分支前面会标一个*符号</code></pre> <p>然后,我们就可以在dev分支上正常提交,比如对test.txt文件做修改:</p> <pre><code>[jonson@localhost mygit]$ echo "create a new brach" &gt;&gt; text.txt [jonson@localhost mygit]$ cat text.txt # this is jonson first repo create a new brach 然后提交: [jonson@localhost mygit]$ git add text.txt [jonson@localhost mygit]$ git commit -m "branch test" [dev e2d7f2d] branch test 1 file changed, 1 insertion(+)</code></pre> <p>现在,dev分支的工作完成,我们就可以切换回master分支:</p> <pre><code>[jonson@localhost mygit]$ git checkout master Switched to branch 'master' [jonson@localhost mygit]$ git branch dev * master [jonson@localhost mygit]$ cat text.txt # this is jonson first repo</code></pre> <p>切换回master分支后,在查看刚刚修改的文件,刚才添加的内容不见了。原因是那个提交是在dev分支上,而master分支此刻的提交点并没有变:<br /><img alt="分布式版本控制系统(git分支管理)" class="b-lazy" data-src="https://s4.51cto.com/images/blog/202004/05/dd9348e5c54d3c15fc400c474bcfb6af.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" data-original="https://s4.51cto.com/images/blog/202004/05/dd9348e5c54d3c15fc400c474bcfb6af.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /></p> <p>合并分支:<br />现在,我们把dev分支的工作成果合并到master分支上:</p> <pre><code>[jonson@localhost mygit]$ git merge dev Updating 7646ab6..e2d7f2d Fast-forward text.txt | 1 + 1 file changed, 1 insertion(+) [jonson@localhost mygit]$ cat text.txt # this is jonson first repo create a new brach</code></pre> <p><code>git merge</code>命令用于合并指定分支到当前分支。合并后,再查看文件的内容,就可以看到,和dev分支的最新提交是完全一样的。</p> <p>注意:上面的<code>Fast-forward</code>信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master执行dev的当前提交,所以合并速度非常快,当然,也不是每次合并都是<code>Fast-forward</code>,后面会讲其他方式的合并。</p> <p>#合并完成后,如果需要删除dev分支,可以执行以下命令:</p> <pre><code>[jonson@localhost mygit]$ git branch -d dev Deleted branch dev (was e2d7f2d). [jonson@localhost mygit]$ git branch * master #删除后,查看branch,就只剩下master分支了。</code></pre> <p><strong>小结</strong><br />Git鼓励大量使用分支:</p> <pre><code>查看分支:git branch 创建分支:git branch &lt;name&gt; 切换分支:git checkout &lt;name&gt; 创建+切换分支:git checkout -b &lt;name&gt; 合并某分支到当前分支:git merge &lt;name&gt; 删除分支:git branch -d &lt;name&gt;</code></pre> <h4>3,解决冲突</h4> <p>人生不如意之事十有八九,合并分支往往也不是一帆风顺的。<br />1)准备新的分支(feature1)</p> <pre><code>[jonson@localhost mygit]$ git checkout -b feature1 Switched to a new branch 'feature1'</code></pre> <p>修改test.txt文件并提交:</p> <pre><code>[jonson@localhost mygit]$ echo "create two branch" &gt;&gt; text.txt [jonson@localhost mygit]$ cat text.txt # this is jonson first repo create a new brach create two branch [jonson@localhost mygit]$ git add text.txt [jonson@localhost mygit]$ git commit -m "two branch" [feature1 78292e2] two branch 1 file changed, 1 insertion(+)</code></pre> <p>切换到master分支:</p> <pre><code>[jonson@localhost mygit]$ git checkout master Switched to branch 'master' Your branch is ahead of 'origin/master' by 1 commit. (use "git push" to publish your local commits) #git提示我们当前master分支比远程的master分支超前1个提交。</code></pre> <p>接下来,在master分支上也进行修改并提交:</p> <pre><code>[jonson@localhost mygit]$ echo "create a three branch" &gt;&gt; text.txt [jonson@localhost mygit]$ git add text.txt [jonson@localhost mygit]$ git commit -m "three branch" [master e27d699] three branch 1 file changed, 1 insertion(+)</code></pre> <p>现在,<code>master</code>分支和<code>feature1</code>分支各自都分别有新的提交,变成了这样:<br /><img alt="分布式版本控制系统(git分支管理)" class="b-lazy" data-src="https://s4.51cto.com/images/blog/202004/05/dd525308ffe5633bb00dd80a6d33bbe6.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" data-original="https://s4.51cto.com/images/blog/202004/05/dd525308ffe5633bb00dd80a6d33bbe6.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><br />这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,我们试试看:</p> <pre><code>[jonson@localhost mygit]$ git merge feature1 Auto-merging text.txt CONFLICT (content): Merge conflict in text.txt Automatic merge failed; fix conflicts and then commit the result.</code></pre> <p>果然冲突了,Git告诉我们,test.txt文件存在冲突,必须手动解决冲突后再提交。<code>git status</code>可以告诉我们冲突的文件:</p> <pre><code>[jonson@localhost mygit]$ git status # On branch master # Your branch is ahead of 'origin/master' by 2 commits. # # Unmerged paths: # (use "git add/rm &lt;file&gt;..." as appropriate to mark resolution) # # both modified: readme.txt # no changes added to commit (use "git add" and/or "git commit -a")</code></pre> <p>我们可以直接查看test.txt的内容:</p> <pre><code>[jonson@localhost mygit]$ cat text.txt # this is jonson first repo create a new brach &lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD create a three branch ======= create two branch &gt;&gt;&gt;&gt;&gt;&gt;&gt; feature1</code></pre> <p>git用‘&lt;&lt;&lt;&lt;&lt;&lt;&lt;’,’=======’, ‘&gt;&gt;&gt;&gt;&gt;&gt;&gt;’标记出不同分支的内容,我们修改如下后保存:</p> <pre><code>[jonson@localhost mygit]$ cat text.txt # this is jonson first repo create a new brach &lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD create two branch ======= create two branch &gt;&gt;&gt;&gt;&gt;&gt;&gt; feature1</code></pre> <p>再提交:</p> <pre><code>[jonson@localhost mygit]$ git commit -m "new branch" [master 966dd22] new branch</code></pre> <p>现在,master分支和feature1分支变成了下图所示:<br /><img alt="分布式版本控制系统(git分支管理)" class="b-lazy" data-src="https://s4.51cto.com/images/blog/202004/05/2a547ecf87e8d87c567d173400166bfa.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" data-original="https://s4.51cto.com/images/blog/202004/05/2a547ecf87e8d87c567d173400166bfa.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><br />工作完成后,删除feature1分支:</p> <pre><code>[jonson@localhost mygit]$ git branch -d feature1 Deleted branch feature1 (was 78292e2).</code></pre> <p>小结:<br />当Git无法自动合并分支时,就必须解决冲突。解决冲突后,再提交,最后合并完成。</p> <h4>4,分支管理策略</h4> <p>通常,合并分支时,如果可能,Git会用<code>Fast forward</code>模式,但这种模式下,删除分支后,会丢掉分支信息。如果要强制禁用<code>Fast forward</code>模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。下面来进行实践:<br />1)首先,仍然创建并切换dev分支:</p> <pre><code> [jonson@localhost mygit]$ git checkout -b dev Switched to a new branch 'dev' [jonson@localhost mygit]$ git branch * dev master</code></pre> <p>修改test.txt文件,并提交一个新的commit:</p> <pre><code>[jonson@localhost mygit]$ echo "create four branch" &gt;&gt; text.txt [jonson@localhost mygit]$ git add text.txt [jonson@localhost mygit]$ git commit -m "add merge" [dev e730d1b] add merge 1 file changed, 1 insertion(+)</code></pre> <p>现在我们切换回master:</p> <pre><code>[jonson@localhost mygit]$ git checkout master Switched to branch 'master'</code></pre> <p>准备合并dev分支,请注意<code>--no-ff</code>参数,表示禁用<code>Fast forward</code>:</p> <pre><code>[jonson@localhost mygit]$ git merge --no-ff -m "merge with no-ff" dev Merge made by the 'recursive' strategy. text.txt | 1 + 1 file changed, 1 insertion(+)</code></pre> <p>因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。合并后,我们用<code>git log</code> 看看分支历史:<br /><img alt="分布式版本控制系统(git分支管理)" class="b-lazy" data-src="https://s4.51cto.com/images/blog/202004/05/64c13fa2a7654a05723b75ca0cbff40c.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" data-original="https://s4.51cto.com/images/blog/202004/05/64c13fa2a7654a05723b75ca0cbff40c.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><br />可以看到,不使用<code>Fast forward</code>模式,merge后就像这样:<br /><img alt="分布式版本控制系统(git分支管理)" class="b-lazy" data-src="https://s4.51cto.com/images/blog/202004/05/23657dd076523521d7762af6d22e998d.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" data-original="https://s4.51cto.com/images/blog/202004/05/23657dd076523521d7762af6d22e998d.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /></p> <p>小结:<br />Git分支十分强大,在团队开发中应该充分应用。<br />合并分支时,加上<code>--no-ff</code>参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而<code>fast forward</code>合并就看不出来曾经做过合并。</p> <h4>5,Bug分支</h4> <p>软件开发中,必定会有bug。有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。</p> <p>当你接到一个修复一个代码101的bug的任务时,很自然的,你想创建一个临时分支来修复它, 但是,当前正在dev上进行的工作还没有提交:</p> <pre><code>[jonson@localhost mygit]$ echo "create five branch" &gt;&gt; text.txt [jonson@localhost mygit]$ git status # On branch dev # Changes not staged for commit: # (use "git add &lt;file&gt;..." to update what will be committed) # (use "git checkout -- &lt;file&gt;..." to discard changes in working directory) # # modified: text.txt # # Untracked files: # (use "git add &lt;file&gt;..." to include in what will be committed) # # new-repo/ no changes added to commit (use "git add" and/or "git commit -a")</code></pre> <p>此时,问题出现了,工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?<br />幸好,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:</p> <pre><code>[jonson@localhost mygit]$ git stash Saved working directory and index state WIP on dev: e730d1b add merge HEAD is now at e730d1b add merge</code></pre> <p><img alt="分布式版本控制系统(git分支管理)" class="b-lazy" data-src="https://s4.51cto.com/images/blog/202004/05/ca1460f24988f33891c78f08be18713b.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" data-original="https://s4.51cto.com/images/blog/202004/05/ca1460f24988f33891c78f08be18713b.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><br />现在,可以查看工作区,可以看到就是干净的了,因此可以放心地创建分支来修复bug。</p> <p>首先确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支(issue-101):</p> <pre><code>[jonson@localhost mygit]$ git checkout master Switched to branch 'master' Your branch is ahead of 'origin/master' by 2 commits. (use "git push" to publish your local commits) [jonson@localhost mygit]$ git checkout -b issue-101 Switched to a new branch 'issue-101'</code></pre> <p>现在修复bug,就假如需要把“create four branch”改成“create five branch”,然后提交:</p> <pre><code>[jonson@localhost mygit]$ sed -i 's/four/five/' text.txt [jonson@localhost mygit]$ git add text.txt [jonson@localhost mygit]$ git commit -m "fix bug 101" [issue-101 6484832] fix bug 101 1 file changed, 1 insertion(+), 1 deletion(-)</code></pre> <p>修复完成后,切换到master分支,并完成合并,最后再删除这个临时分支:</p> <pre><code>[jonson@localhost mygit]$ git checkout master [jonson@localhost mygit]$ git merge --no-ff -m "merged bug fix 101" issue-101 Merge made by the 'recursive' strategy. text.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) [jonson@localhost mygit]$ git branch -d issue-101 Deleted branch issue-101 (was 6484832).</code></pre> <p>这下问题解决了,原计划两个小时的bug修复只花了5分钟!现在,又可以接着回到dev分支干活了:</p> <pre><code>[jonson@localhost mygit]$ git checkout dev Switched to branch 'dev' [jonson@localhost mygit]$ git status # On branch dev # Untracked files: # (use "git add &lt;file&gt;..." to include in what will be committed) # # new-repo/ nothing added to commit but untracked files present (use "git add" to track)</code></pre> <p>工作区此时是干净的,因为刚才的工作现场我们用<code>git stash</code>储藏起来了,可以用<code>git stash list</code> 命令看看:</p> <pre><code>[jonson@localhost mygit]$ git stash list stash@{0}: WIP on dev: e730d1b add merge</code></pre> <p>所以现在我们需要恢复一下,有两种方式:<br />一种是用<code>git stash apply</code> 恢复,但是回复后,stash内容并删除,你还需要用<code>git stash drop</code>来删除。<br />另一种是用git starh pop,恢复的同时把stash内容也删了(所以一般采用这种方法):<br /><img alt="分布式版本控制系统(git分支管理)" class="b-lazy" data-src="https://s4.51cto.com/images/blog/202004/05/b98492bc9c1d5707a5b08c853455607f.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" data-original="https://s4.51cto.com/images/blog/202004/05/b98492bc9c1d5707a5b08c853455607f.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><br />再用git stash list 查看,就看不到stash内容了,并且也恢复到之前的工作状态:<br /><img alt="分布式版本控制系统(git分支管理)" class="b-lazy" data-src="https://s4.51cto.com/images/blog/202004/05/f14de636860dfe01e123a928a4365c38.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" data-original="https://s4.51cto.com/images/blog/202004/05/f14de636860dfe01e123a928a4365c38.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><br />#当你多次stash时,如果你要恢复指定的stash,用以下命令:<br /><code>git stash apply stash@{0}</code></p> <p>小结:<br />修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除。<br />当手头工作没有完成时,先把工作现场<code>git stash</code>储藏起来,然后去修复bug,再<code>git stash pop</code>,删除stash内容,并恢复到工作现场。</p> <h4>6,多人协作</h4> <p>当你从远程库克隆时,实际上Git自动把本地master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。</p> <pre><code>#要查看远程库的详细信息,用`git remote -v`: [jonson@localhost mygit]$ git remote -v origin git@github.com:sqm-sys/jonson-repo.git (fetch) origin git@github.com:sqm-sys/jonson-repo.git (push)</code></pre> <p>上面显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址。</p> <p><strong>推送分支</strong><br />推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:</p> <pre><code>[jonson@localhost mygit]$ git push origin master 推送其他分支: [jonson@localhost mygit]$ git push origin dev</code></pre> <p>但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?</p> <ul><li>master分支是主分支,因此需要时刻与远程同步;</li> <li>dev 分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;</li> <li>bug分支只用于在本地修复bug,就没必要推到远程了,除非领导要看看你每周到底修复了几个bug;</li> </ul><p><strong>抓取分支</strong><br />多人协作时,大家都会往master和dev分支上推送各自的修改。</p> <p>现在,模拟一个你的同事,可以在另一台电脑(注意要把SSH key添加得到GitHub)下克隆:<br /><img alt="分布式版本控制系统(git分支管理)" class="b-lazy" data-src="https://s4.51cto.com/images/blog/202004/05/bf5a48ab9f99aeeed92057faa39178a8.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" data-original="https://s4.51cto.com/images/blog/202004/05/bf5a48ab9f99aeeed92057faa39178a8.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /></p> <pre><code>[zhangsan@localhost ~]$ git clone git@github.com:sqm-sys/jonson-repo.git Cloning into 'jonson-repo'... remote: Enumerating objects: 26, done. remote: Counting objects: 100% (26/26), done. remote: Compressing objects: 100% (12/12), done. remote: Total 26 (delta 5), reused 25 (delta 4), pack-reused 0 Receiving objects: 100% (26/26), done. Resolving deltas: 100% (5/5), done.</code></pre> <p>需要的注意的是,你的同事从远程库clone时,默认情况下,只能看到本地的master分支,而看不到其他分支:</p> <pre><code>[zhangsan@localhost ~]$ cd jonson-repo/ [zhangsan@localhost jonson-repo]$ git branch * master</code></pre> <p>现在,你的同事要在dev分支上开发,就必须创建远程origin的dev分支到本地(可以执行以下命令):</p> <pre><code>[zhangsan@localhost jonson-repo]$ git checkout -b dev origin/dev Branch dev set up to track remote branch dev from origin. Switched to a new branch 'dev'</code></pre> <p>此时,他就可以在dev上分支上进行修改了,然后,时不时的把dev分支push到远程:</p> <pre><code>[zhangsan@localhost jonson-repo]$ echo "create six branch" &gt;&gt; text.txt [zhangsan@localhost jonson-repo]$ git add text.txt [zhangsan@localhost jonson-repo]$ git commit -m "add six branch" [dev f50cefa] add six branch 1 file changed, 1 insertion(+) [zhangsan@localhost jonson-repo]$ git push origin dev Counting objects: 5, done. Delta compression using up to 2 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 287 bytes | 0 bytes/s, done. Total 3 (delta 1), reused 0 (delta 0) remote: Resolving deltas: 100% (1/1), completed with 1 local object. To git@github.com:sqm-sys/jonson-repo.git c7d965a..f50cefa dev -&gt; dev</code></pre> <p>你的同事已经向origin/dev分支推送了他的提交,而此时你也对同样的文件作了修改,并试图推送:</p> <pre><code>[jonson@localhost mygit]$ git branch * dev master [jonson@localhost mygit]$ echo "ha ha ha " &gt;&gt; text.txt [jonson@localhost mygit]$ git add text.txt [jonson@localhost mygit]$ git commit -m "this is haha" [dev 94c4cde] this is haha 1 file changed, 1 insertion(+) [jonson@localhost mygit]$ git push origin dev #进行推送 To git@github.com:sqm-sys/jonson-repo.git ! [rejected] dev -&gt; dev (fetch first) error: failed to push some refs to 'git@github.com:sqm-sys/jonson-repo.git' hint: Updates were rejected because the remote contains work that you do hint: not have locally. This is usually caused by another repository pushing hint: to the same ref. You may want to first merge the remote changes (e.g., hint: 'git pull') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details.</code></pre> <p>推送失败,原因是你的同事的最新提交和你试图推送的提交有冲突,解决办法也很简单,Git已经提示我们:先用<code>git pull</code>把最新的提交从<code>origin/dev</code>抓下来,然后,在本地合并,解决冲突,再推送:<br /><img alt="分布式版本控制系统(git分支管理)" class="b-lazy" data-src="https://s4.51cto.com/images/blog/202004/05/12f43c48dfcc308c6d6592bca4b89994.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" data-original="https://s4.51cto.com/images/blog/202004/05/12f43c48dfcc308c6d6592bca4b89994.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><br />可以看到<code>git pull</code>失败了,原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接:</p> <pre><code>[jonson@localhost mygit]$ git branch --set-upstream-to=origin/dev Branch dev set up to track remote branch dev from origin.</code></pre> <p>创建链接后,在执行pull:</p> <pre><code>[jonson@localhost mygit]$ git pull Auto-merging text.txt CONFLICT (content): Merge conflict in text.txt Automatic merge failed; fix conflicts and then commit the result.</code></pre> <p>这回<code>git pull</code>成功,但是合并有冲突,需要手动解决,解决的方法之前的解决冲突完全一样(将冲突的内容进行修改)。解决后,提交,再push:</p> <pre><code>[jonson@localhost mygit]$ git add text.txt [jonson@localhost mygit]$ git commit -m "merge &amp; six branch" [dev 4ba822d] merge &amp; six branch [jonson@localhost mygit]$ git push origin dev Counting objects: 10, done. Delta compression using up to 2 threads. Compressing objects: 100% (4/4), done. Writing objects: 100% (6/6), 616 bytes | 0 bytes/s, done. Total 6 (delta 1), reused 0 (delta 0) remote: Resolving deltas: 100% (1/1), done. To git@github.com:sqm-sys/jonson-repo.git f50cefa..4ba822d dev -&gt; dev</code></pre> <p>push成功,因此,多人协作的工作模式通常是这样:</p> <p>1)首先,可以试图用'git push origin &lt;branch-name&gt;' 推送自己的修改;<br />2)如果推送失败,则因为远程分支比你的本地更新,需要先用<code>git pull</code>试图合并;<br />3)如果合并冲突,则解决冲突,并在本地提交;<br />4) 没有冲突或者解决掉冲突后,再用'git push origin &lt;branch-name&gt;' 推送就能成功;<br />如果<code>git pull</code>提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令'git branch --set-upstream-to=origin/&lt;branch-name&gt; '。<br />这就是多人协作的工作模式。。。</p><div class="alert alert-success" role="alert"><p>来源:<code>51CTO</code></p><p>作者:<code>wx5b9c94b17c62a</code></p><p>链接:<code>https://blog.51cto.com/13972012/2485046</code></p></div></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/origin" hreflang="zh-hans">origin</a></div> <div class="field--item"><a href="/tag/git" hreflang="zh-hans">git</a></div> <div class="field--item"><a href="/tag/master" hreflang="zh-hans">master</a></div> <div class="field--item"><a href="/tag/banbenkongzhixitong" hreflang="zh-hans">版本控制系统</a></div> <div class="field--item"><a href="/tag/gitjiejuechongtu" hreflang="zh-hans">git解决冲突</a></div> <div class="field--item"><a href="/tag/gitqiehuanfenzhi" hreflang="zh-hans">git切换分支</a></div> <div class="field--item"><a href="/tag/gittijiaodaima" hreflang="zh-hans">git提交代码</a></div> <div class="field--item"><a href="/tag/banbenkongzhi" hreflang="zh-hans">版本控制</a></div> <div class="field--item"><a href="/tag/yuanchenggongzuo" hreflang="zh-hans">远程工作</a></div> <div class="field--item"><a href="/tag/dev" hreflang="zh-hans">dev</a></div> <div class="field--item"><a href="/tag/merge" hreflang="zh-hans">merge</a></div> <div class="field--item"><a href="/tag/repo" hreflang="zh-hans">repo</a></div> </div> </div> Sun, 05 Apr 2020 16:47:12 +0000 强颜欢笑 3546561 at https://www.e-learn.cn