Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

版本控制:Git 和 SVN #43

Open
ShannonChenCHN opened this issue Apr 27, 2017 · 12 comments
Open

版本控制:Git 和 SVN #43

ShannonChenCHN opened this issue Apr 27, 2017 · 12 comments

Comments

@ShannonChenCHN
Copy link
Owner

ShannonChenCHN commented Apr 27, 2017

目录

  • 版本控制
  • Git
    • Git 的起源
    • Git 的安装和配置
    • SSH
    • Git 的基本用法
    • Git 的高级用法
    • Git 的原理
    • 使用 Git 时的常见问题
    • Git workflow
    • Gitlab、gitbucket
    • Git 源码
  • SVN
    • SVN 的起源
    • SVN 的基本用法
    • SVN 的高级用法
    • SVN 的原理
    • 使用 SVN 时的常见问题
  • Git 和 SVN 的比较

关联 issue

延伸阅读

@ShannonChenCHN ShannonChenCHN changed the title 【专题】版本控制 【专题】版本控制:Git 和 SVN Apr 27, 2017
@ShannonChenCHN
Copy link
Owner Author

ShannonChenCHN commented Apr 27, 2017

使用 Git 时的常见问题

1. git add 之后用 git reset --hard 撤销了,但是没有 commit 过,如何恢复之前 add 过的修改?

(1) 执行 find .git/objects -type f | xargs ls -lt | sed 60q ,查看最近 60 次的 add 记录;
(2) 使用 git cat-file -p ID > output_file_name.m ,将 ID 所示的文件读取出来重定向保存到 output_file_name.m 文件内,ID 是 objects 后面的一串东西,比如保存记录的目录是 .git/objects/6b/3fe19b5cf5357d21a1f79ffb2c81ac7b6d81b1,那么 ID 就是 6b3fe19b5cf5357d21a1f79ffb2c81ac7b6d81b1 。(需要去掉 “/”)。

建议:
- 不要随便使用 git reset --hard 命令;
- 多使用 git add命令,没有使用过 git add 命令就撤销修改了的话,是无法回复修改内容的;
- 提交时,按修改内容的相关性分别提交,不要一次性提交一大堆逻辑不相关的修改,保证一次只改一个逻辑或者功能。
参考:
- 恢复 git reset --hard 删除的文件
- Undo git reset --hard with uncommitted files in the staging area

2. How to undo 'git add' before commit?

git reset <file> 撤销添加某一个文件到暂存区的操作
git reset 撤销上次添加文件到暂存区的操作
延伸阅读

3. git add -Agit add . 以及 git add -u 的区别

git add -A:把所有新建、修改、删除的记录修改添加到暂存区
git add .:把所有新建、修改的记录修改添加到暂存区,不包括删除的文件
git add -u:把所有修改、删除的记录修改添加到暂存区,不包括新建的文件

参考:

4.如何撤销 最近一次的git commit 操作?

git reset HEAD~

参考:

5. 执行 git pull 命令时,报错:

shannonchensmbp:Playground ShannonChen$ git pull
error: The following untracked working tree files would be overwritten by merge:
	ImageResizingExample/.DS_Store
Please move or remove them before you can merge.
Aborting

解决办法:执行 git clean -d -fx "" 命令,删掉不需要的文件

参考:The following untracked working tree files would be overwritten by checkout

6. 如何查看指定 commit 提交的修改内容?

git show <commit id>

7. 生成 SSH 公钥

三步:

  • generate an SSH key
  • add it to the ssh-agent
  • then add the key to your Git repo account

参考:

8. 如何为不同 Git 仓库所对应的不同用户设置不同的 SSH 授权信息

比如,在你的电脑上,有一个个人的 Github 仓库,另外还有一个公司的 Git 仓库,这两个仓库对应不同的用户信息,所以需要生成不同的 SSH key。

参考:

9. git stash 的用法

10. 如何删掉本地的 untracked 文件?

Step1:先查看要删除的文件:

git clean -n

Step2:然后再删除文件:

git clean -f

如果要删掉的是目录,执行 git clean -f -d 或者 git clean -fd
如果要删掉的是 ignored files,执行 git clean -f -X 或者 git clean -fX
如果要删掉的是 ignored 和 non-ignored files, 执行 git clean -f -x 或者 git clean -fx

参考:

11. git fetch origin --prune 命令

--prune 选项表示在 fetch 的时候,从本地仓库中删除远程已经删除的分支。

参考:

12. 执行 git pull --rebase 时报错:

rebase in progress; onto 9c168a5
You are currently rebasing branch 'master' on '9c168a5'.
(all conflicts fixed: run "git rebase --continue")
nothing to commit, working directory clean

解决办法:
先 abort,(如果有冲突就解决冲突)然后再重新执行 rebase 操作。

参考:

@ShannonChenCHN ShannonChenCHN changed the title 【专题】版本控制:Git 和 SVN 版本控制:Git 和 SVN Jul 2, 2017
@ShannonChenCHN
Copy link
Owner Author

ShannonChenCHN commented Jul 5, 2017

SVN 工作流

1. tags,branches,trunk 是什么?

tags,branches,trunk 在 SVN 代码仓库中并没有什么实际意义,仅仅是大家常用的一种惯例。

2. tags,branches,trunk 分别是用来干什么的?

  • tags:定期保存的代码,其实主要是为了“备份”,每次发布版本后都会保存一份,粒度比较细,比如 1.0.0,1.0.1,1.0.2
  • branches :跟 tag 类似,也是定期保存的代码,但是力度会更粗些,一般保存的是大版本(major release) 的代码,比如 1.0,1.1,1.2。
    • 在一个大版本(比如1.0)的 branch 上,我们可以做一些小的修改,比如修 bug,而不会把 trunk 上的此时开发的新版本(比如1.1)的代码引入,修改完后,我们可以直接给这个 branch打一个 tag(比如 1.0.1),然后发布这个小版本(1.0.1)就行了。
    • 发布完小版本(1.0.1)后,我们还需要把对应 branch (1.0)上的代码同步(merge)到 trunk 上
    • branches 上的分支也可能不是跟踪版本的,也有可能是开发一个单独的功能,等功能完成后再合并到 trunk 上,但是在开发过程中,一般需要将 trunk 上的代码 merge 过来,以保持同步,否则到最后该功能开发完成 merge 到 trunk 时,会出现很多冲突。
  • trunk:平时日常开发时的主要工作空间,一般来说,最新的代码都在 trunk 上,如果 branch 上有了新的改动,一般会把 branch 上的修改同步(merge)过来

参考:

@ShannonChenCHN
Copy link
Owner Author

ShannonChenCHN commented Sep 22, 2017

@ShannonChenCHN
Copy link
Owner Author

ShannonChenCHN commented Sep 29, 2017

【SVN】SVN 常见问题

1. 代码回滚

1.1 修改的代码还没有 commit 过

执行 revert 操作就可以了

1.2 修改的代码已经 commit 过了

方式一:SmartSVN

在 SmartSVN 菜单上选择 log,然后选择指定的 revision,再使执行 rollback 操作,本地就能会回滚到指定的提交记录版本上了,最后还需要通过 commit 同步到服务器上。

方式二:命令行

① 更新到最新的代码
假定我们最新的提交记录是 revision 100

svn update 

② 确定要回滚的版本号 revision, 查看提交记录:

svn log 

假设需要回滚到 revision 98,如果需要查看提交记录的详细内容,还可以使用命令 svn diff -r 100:98
③ 回滚到版本号 98

svn merge -r 100:98 .

为了保险起见,再次确认回滚的结果:

svn diff

④ 提交回滚的操作:

svn commit -m "Revert revision from r100 to r98"

参考:

2. 合并分支

跟 git 上的 merge 操作类似,svn 也有 merge 操作,直接将一个 branch 合并到 trunk 上就行了,或者将 trunk 合并到一个 branch 上,如果出现冲突(conflict),解决冲突就行了。

@ShannonChenCHN
Copy link
Owner Author

ShannonChenCHN commented Jun 19, 2018

【Git】场景:如何为不同 Git 仓库所对应的不同用户设置不同的 SSH 授权信息

背景

比如,在你的电脑上,有一个个人的 Github 仓库,另外还有一个公司的 Git 仓库,这两个仓库对应不同的用户信息,所以需要生成不同的 SSH key。

分析

当你有两个不同的 Git 仓库而且对应不同的用户信息时,就会出现第二个仓库的 SSH key 覆盖掉第一个仓库的 SSH key。

解决办法

  • 为不同的账户生成不同的 SSH key(生成 SSH key 时要注意保存为自定义的名字,不要使用默认的名字),并在不同的 Git 仓库服务器上添加各自的公钥。
  • ~/.ssh目录下创建一个名字叫做 config 的普通文本文件(如果已经有了的话,直接打开编辑就行了),并在其中填好各个账户信息。格式如下:
# GitHub
Host github.com
	HostName github.com
 	PreferredAuthentications publickey
        IdentityFile ~/.ssh/id_rsa_github
        User ShannonChen

# GitLab
Host gitlab.com
	HostName gitlab.com
 	PreferredAuthentications publickey
        IdentityFile ~/.ssh/id_rsa_gitlab
        User ShannonChen

其他问题

如果之前有设置全局用户名和邮箱的话,需要先重置一下全局的用户信息,然后再在不同的仓库下分别设置各自的用户名和邮箱。

查看 config 信息

查看系统config:

git config --system --list

查看当前用户(global)配置:

git config --global  --list

查看当前仓库配置信息:

git config --local  --list

延伸

  • 什么是 SSH key

参考:

@ShannonChenCHN
Copy link
Owner Author

ShannonChenCHN commented Jun 25, 2018

【Git】Gerrit 工作流程

Gerrit 实际上是一个 Git 服务器,它为在其服务器上托管的 Git 仓库提供一系列权限控制,以及一个用来做Code Review 的 Web 前台页面。当然,其主要功能就是用来做Code Review。

Gerrit 的工作流程:

image

使用过git的同学,都知道,当我们git add --> git commit --> git push 之后,你的代码会被直接提交到repo,也就是代码仓库中,就是图中橘红色箭头指示的那样。

那么gerrit就是上图中的那只鸟,普通成员的代码是被先push到gerrit服务器上,然后由代码审核人员,就是左上角的integrator在web页面进行代码的审核(review),可以单人审核,也可以邀请其他成员一同审核,当代码审核通过(approve)之后,这次代码才会被提交(submit)到代码仓库(repo)中去。

无论有新的代码提交待审核,代码审核通过或被拒绝,代码提交者(Contributor)和所有的相关代码审核人员(Integrator)都会收到邮件提醒。
gerrit还有自动测试的功能,和主线有冲突或者测试不通过的代码,是会被直接拒绝掉的,这个功能似乎就是右下角那个老头(Jenkins)的任务。

整个流程就是这样。

注意点

在使用过程中,有两点需要特别注意下:

  • 当进行commit时,必须要生成一个Change-Id,否则,push到gerrit服务器时,会收到一个错误提醒。
    提交者不能直接把代码推到远程的master主线(或者其他远程分支)上去。这样就相当于越过了gerrit了。 gerrit必须依赖于一个refs/for/*的分支。
  • 假如我们远程只有一个master主线,那么只有当你的代码被提交到 refs/for/master 分支时(使用 git push origin HEAD:refs/for/master而不是 git push origin master),gerrit才会知道,我收到了一个需要审核的代码推送,需要通知审核员来审核代码了。当审核通过之后,gerrit会自动将这条分支合并到master主线上,然后邮件通知相关成员,master分支有更新,需要的成员再去pull就好了。

为什么要使用 change-id

保证已经提交审核的修订通过审核入库后,被别的分支 cherry-pick 后再推送至服务器时不会产生新的重复的评审任务。Gerrit 设计了一套方法,即要求每个提交包含唯一的 Change-Id,这个 Change-Id 因为出现在日志中,当执行 cherry-pick 时也会保持,Gerrit 一旦发现新的提交包含了已经处理过的 Change-Id ,就不再为该修订创建新的评审任务和 task-id,而直接将提交入库。

解决“ERROR:missing Change-Id in commit message”

see Gerrit error when Change-Id in commit messages are missing.

参考

@ShannonChenCHN
Copy link
Owner Author

ShannonChenCHN commented Jun 25, 2018

【Git】How to change committer email address during git push

问题

在 push 时出现邮箱不正确的提示,如何修改之前已经提交 commit 的用户信息?

Pushing to https://gerrit.googlesource.com/gerrit
POST git-receive-pack (11557 bytes)
remote: Resolving deltas: 100% (76/76)           remote: Resolving deltas: 100% (76/76)        
remote: Processing changes: refs: 1        remote: Processing changes: refs: 1, done            
remote: 
remote: ERROR:  In commit 0a99723fd7039844ce697997916910ce11bdcb4a        
remote: ERROR:  committer email address mani_c...@yahoo.co.in        
remote: ERROR:  does not match your user account.        
remote: ERROR:        
remote: ERROR:  The following addresses are currently registered:        
remote: ERROR:    mani.c...@tcs.com        
remote: ERROR:        
remote: ERROR:  To register an email address, please visit:        
remote: ERROR:  https://gerrit-review.googlesource.com/#/settings/contact        
remote: 
remote: 
To https://gerrit.googlesource.com/gerrit

解决办法

$ git config user.email yournewemail@example.org
$ git commit --amend

参考

@ShannonChenCHN
Copy link
Owner Author

【Git】合并代码后,出现冲突,如何撤销冲突文件的本地修改?

问题

$ git status foo/bar.txt
# On branch master
# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#       deleted by us:      foo/bar.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

执行 checkout 之后报错:

$ git checkout HEAD foo/bar.txt
error: path 'foo/bar.txt' is unmerged
$ git reset HEAD foo/bar.txt
Unstaged changes after reset:
M       foo/bar.txt

解决方法

$ git reset foo/bar.txt
$ git checkout foo/bar.txt

参考

@ShannonChenCHN
Copy link
Owner Author

ShannonChenCHN commented Jul 13, 2018

【Git】同步远程分支信息

远程仓库新增或者删除分支后,直接通过 git branch -a 或者 git remote -a 无法从 branch list 中看到是否新增/删除了分支。

如果是新增了分支,本地仓库可通过下面的命令同步分支信息:

git fetch

如果是删除了分支,本地仓库可通过下面的命令同步分支信息:

git fetch --prune

在 git 1.8.5 以后可以通过修改配置来实现自动 prune:

git config fetch.prune true

参考

@ShannonChenCHN
Copy link
Owner Author

ShannonChenCHN commented Mar 8, 2019

软件版本周期

软件测试发布流程

版本名称 介绍 说明
alpha 内测版 内部测试版本
beta 公测版 Beta阶段会一直加入新的功能
RC 候选版 几乎就不会加入新的功能了,而主要着重于除错
Release 正式版 稳定版本

2019-03-08 10 57 08

那么我们经常听说的 RC 版本是什么意思呢?

RC=Release Candidate,含义 是"发布候选版",它不是最终的版本,而是最终版(RTM=Release To Manufacture)之前的最后一个版本。

广义上对测试有三个传统的称呼:alpha、beta、gamma(分贝对应希腊字母α,β,γ),用来标识测试的阶段和范围。alpha 是指内测,即现在说的CB,指开发团队内部测试的版本或者有限用户体验测试版本。beta 是指公测,即针对所有用户公开的测试版本。然后做过一些修改,成为正式发布的候选版本时叫做gamma,现在叫做RC(Release Candidate)。

和 Beta 版最大的差别在于 Beta 阶段会一直加入新的功能,但是到了 RC 版本,几乎就不会加入新的功能了,而主要着重于除错。

Software release life cycle

1. Stages of development

1.1 Pre-alpha: before formal testing

1.2 Alpha: the first phase to begin software testing

1.3 Beta: feature complete but likely to contain a number of known or unknown bugs

  • Perpetual beta: new features and functionality are continually added to the software
  • Open and closed beta
    • closed beta: versions are released to a restricted group of individuals for a user test by invitation
    • open beta: testers are from a larger group, or anyone interested

1.4 Release candidate: a beta version with potential to be a final product, which is ready to release unless significant bugs emerge.

2. Release

  • Release to manufacturing (RTM): is ready to be delivered
  • General availability (GA): the marketing stage at which all necessary commercialization activities have been completed and a software product is available for purchase, depending, however, on language, region, electronic vs. media availability
  • Release to web (RTW): a means of software delivery that utilizes the Internet for distribution

image

参考

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant