git 操作规范

git 操作规范
 

 

1. Git基础

 

1.1. 全局配置

 

 

用户信息配置

$ git config --global user.name "jack"  
$ git config --global user.email "jack@xxx.com

 

高亮配置

 git config --global color.ui auto

 

别名配置

$ git config --global alias.st status 
$ git config --global alias.ci commit 
git config --global alias.co checkout 
下面表示智能个性化log查看: 
$ git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

 

在git中可以设置你想要的编辑器

t config --global core.editor

 

   

 

1.2. 工作区

 

 

从现有仓库克隆

git clone [url] 
例如:
$ git clone git://github.com/schacon/grit.git

 

创建远程origin的dev分支到本地

如果成员要在dev分支上开发,就需要创建远程origin的dev分支到本地(前提是分支与远程上的分支对应) 
$ git checkout -b dev origin/dev 
然后建立本地分支和远程分支的关联: 
$ git branch --set-upstream dev origin/dev

 

   

 

1.3. 开始工作

 

如果上面的我们准备好了,那么现在就开始工作吧!  

 

1.3.1. 每次更改代码的操作

  

 

功能

命令

说明

 

更新本地代码到最新版本(需要merge才能合到本地代码中)

git fetch

 
 

合并更新后的代码到本地

git merge

 
 

更新代码方式的另一种方法

git pull 
git pull是git fetch和git merge命令的一个组合

git pull origin v3.2

 

修改代码后,查看已修改的内容

git diff --cached

 
 

将新增加文件加入到git中

git add file1 file2 file3

 
 

从Git中删除文件

git rm file1
git rm -r dir1

 
 

提交修改

git commit -m 'this is memo'

 
 

如果想省掉提交之前的 git add 命令

git commit -a -m 'this is memo'

 
 

commit和commit -a的区别

第一步:自动地add所有改动的代码,使得所有的开发代码都列于index file中
第二步:自动地删除那些在index file中但不在工作树中的文件
第三步:执行commit命令来提交

 
 

提交所有修改到远程服务器

git push

可以明确指定远端仓库:git push origin v3.2

 

      

 

1.3.2. 一个分支上的整个流程

 

默认的我们使用master分支,以下就以这个分支来进行整个工作流程。  

[1].新建或修改文件  

 

 $ >a.py #更简洁的一种Linux创建文件的方式
 # 或者使用 $ touch a.py
 # 以下按照这个文件处理:
 $ echo 'print "Hello,world"'>test.py

 

这里新建了一个test.py文件并编辑了内容。常见庆幸比如我们复制进入几个图片,样式等等。  

[2].查看状态  

 

 $ git status
 On branch master
 Untracked files:
   (use "git add <file>..." to include in what will be committed)
 
         test.py
 
 nothing added to commit but untracked files present (use "git add" to track)

 

中文翻译就是:  

 

 在master分支上
 未暂存文件:
 (使用`git add <file>`加入暂存区)

 

这里会衍生2个扩展:(1)暂存区/工作区/本地仓库、(2)git add命令详解  

  • 暂存区:暂且看作临时常所,午托中介(后面会有详解);工作区:就是你的项目所在你电脑上哪个盘,哪个目录下,不含.git;本地仓库就是你的项目下的.git。 
    • 'git add':  

 

 git add <path>把<path>添加到索引库中,<path>可以是文件也可以是目录。
 git add -u [<path>]: 把<path>中所有tracked文件中
 被修改过或已删除文件的信息添加到索引库。它不会处理untracted的文件.
 git add -A: [<path>]表示把<path>中所有tracked文件中被修改过或已删除文件和所有untracted的文件信息添加到索引库。
 git add -i [<path>]命令查看<path>中被所有修改过或已删除文件但没有提交的文件

 

[3].加入暂存区  

 

 $ git add test.py
 #或者可以这样:$ git add --all 表示全部加入,包含新添加的文件
 # $ git add . #全部加入但不包括新添加的文件

 

不管是新添加的文件,还是修改了的文件,都需要git add <file>,这点不同于SVN  

此刻再查看状态:  

 

  git st
 On branch master
 Changes to be committed:
   (use "git reset HEAD <file>..." to unstage)
 
         new file:   test.py

 

意思就是在master分支上,以下列表文件改变待提交,可以使用git reset HEAD <file>拉回未暂存区。相应的原先红色变成了现在的绿色。  

这里衍生了一个扩展:(3)如何拉回未暂存区  

[4].查看快照  

 

  git diff  #尚未暂存的文件更新了哪些部分(unstaged)和上次提交与本地索引间的差异
 $ git diff --cached  #已暂存的文件和上次提交时的快照之间的差异(staged,添加到索引中)
 #上面效果同:git diff --staged
 $ git diff HEAD显示你工作目录与上次提交时之间的所有差别

 

如下:  

 

  git diff HEAD
 diff --git a/test.py b/test.py
 new file mode 100644
 index 0000000..15715f8
 --- /dev/null
 +++ b/test.py
 @@ -0,0 +1 @@
 +print "Hello,world"

 

意思如下:---代表源文件;+++代表目标文件;-开头的行,是只出现在源文件中的行;+开头的行,是只出现在目标文件中的行;每个差异小结的第一行都是定位语句,由@@开头,@@结尾。+print "Hello,world"表示增加的行内容.  

[5].提交版本库  

 

 $ git commit -m 'add test.py'
 
 git commit  -m "提交的描述信息"
 git commit -a -m "提交的描述信息" -a选项将所有被修改或已删除且已经被git管理的文件加入暂存区。
 相当于上面的:git add <file> + git commit -m 'xx'

 

[6].推送远程仓库  

 

 $ git push origin master

 

  • 注意:需要说明的是,默认情况下这条语句等价于提交本地的master仓库到远程仓库,并作为远程的master分支。如果想把本地的某个分支test提交到远程仓库,并作为远程仓库的master分支,或者作为另外一个名叫test的分支,那么可以这么做。  

 

 $ git push origin test:master  #提交本地test分支作为远程的master分支
 $ git push origin test:test    #提交本地test分支作为远程的test分支

 

如果想删除远程的分支呢?类似于上面,如果:左边的分支为空,那么将删除:右边的远程的分支。  

 

 $ git push origin :test        #刚提交到远程的test将被删除,但是本地还会保存的,不用担心。

 

 

1.3.3. 多个分支上的整个流程

 

我们可能需要多个分支,而不是总在一个master主分支上动手脚,比如需要一个dev 开发分支、bug 分支,那么接下来的工作就是多个分支的整个流程。  

[1].创建并切换分支  

 

 $ git branch dev        # 创建分支dev分支
 $ git checkout dev      # 切换到dev分支
 Switched to branch 'dev'
 
 $ git checkout master   # 切换回来(master分支)
 Switched to branch 'master'
 
 #git checkout命令加上-b参数表示创建并切换
 $ git checkout -b bug  # 创建分支bug分支并自动切换
 Switched to a new branch 'bug'

 

[2].查看分支  

 

 $ git branch  # 查看分支
 * bug         # 带*且为绿色表示当前所在的分支
   dev
   master

 

[3].Git储蓄  

情景如下:当你正在开发一个功能时,突然boss让你尽快修改一个bug,此时最紧急的是fix bug. 而正开发的功能尚未完善还不能提交,这个时候就会想到能不能将手头的工作隔离开,去单单解决bug,然后提交bug,然后在进行手头工作。  

 

 git stash  #把当前工作现场“储藏”起来

 

ok,存起来后我们就要改bug了,next step:  

[3].在其他分支上工作  

好了,我现在是在bug分支上,我要把之前的test.py内容的print 'hello world',改成 print '同步课堂',N秒之后,改完了,这个时候的工作流程就回到了上述的“一个分支的整个流程”上了。如下:  

 

 $ git ci -a -m 'update test.py'    # 别名,加入暂存区并提交版本库
 [bug 237586b] update test.py
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 $ git ps origin bug:bug            #提交本地bug分支作为远程的bug分支,如果远程没有会自动创建。
 Counting objects: 5, done.
 Delta compression using up to 2 threads.
 Compressing objects: 100% (2/2), done.
 Writing objects: 100% (3/3), 272 bytes | 0 bytes/s, done.
 Total 3 (delta 1), reused 0 (delta 0)
 To git@github.com:BeginMan/test.git
  * [new branch]      bug -> bug   # 可以从这里看到信息

 

好了,我给Boss说,bug被搞好了。然后我安然的回到我的dev分支上继续完成之前的工作。N小时候,dev上的功能开发好了。那么就Next step:  

[4].合并分支  

在合并分支之前,我们要找到暂存的东西,就好像鬼子进村之后召开村民大会,此时你正在啃玉米棒子,眼看鬼子要来了,你立马把玉米棒装在袜子里面然后藏在床下($ git stash),然后参加完鬼子大会后,你回来要继续啃玉米棒子,你就要找袜子啊,此时$ git stash list查看储藏列表:  

 

  git stash list
 stash@{0}: WIP on dev: 8552442 add merge  #找到了袜子,编号为stash@{0}
 # 接下来就要还原现场了
 $ git stash apply stash@{0} #恢复
 $ git stash drop    #删除
 # 也可以使用git stash pop恢复的同时把stash内容也删了。

 

合并分支继续:  

 

 $ git merge dev     #git merge命令用于合并指定分支到当前分支

 

  • 注意:  

通常,合并分支时Git会用“Fast forward”模式,不会存在历史记录信息,相当于一种无痕模式;可以加上--no-ff参数,表示禁用“Fast forward”,它会合并要创建一个新的commit,所以加上-m参数,合并后git log 就能查看分支历史了:  

 

 $ git merge --no-ff -m "编辑信息" 分支名称
 $ git merge --no-ff -m "merge dev" dev

 

上面的dev分支是我们随便搞了一个临时分支,我们把这个分支上面的成果合并到主分支上。如果不想留着这个临时分支,可以删除,如下:  

[5].删除分支  

 

 $ git branch -d dev
 Deleted branch dev (was 1901221).

  

 

2. FAQ

 

2.1 编码

2.1.1. 中文乱码

 

 

ls不能显示中文目录

在%GIT_HOME%/etc/git-completion.bash中增加一行 
 alias ls='ls --show-control-chars --color=auto' 

 

git commit不能提交中文注释

修改%GIT_HOME%/etc/inputrc中对应的行 
set output-meta on 
set convert-meta off

 

git log无法显示中文注释

在%GIT_HOME%/etc/profile中增加一行 
export LESSCHARSET=iso8859

 

   

2.2 提交和撤销

 

2.2.1 如何放弃本地修改

本地做了一些修改,我用git rebase说有冲突。我现在想把本地的请求都干掉,可能有的已经commit过了(没有push过),完全同步成远程版本,应该用什么命令? 

 
使用命令:
git reset --hard ORIGIN/BRANCH

比如master分支:
git reset --hard origin/master

2.2.2 如何忽略一些文件

  

一些文件,如python编译文件‘pyc’,日志文件‘2014-03-10.log’等等这些不需要提交版本,可以用以下方法解决:创建一个名为 .gitignore 的文件,列出要忽略的文件模式。  

 

 $ >.gitignore   # linux
 copy con .gitignore # windows

 

然后在里面写忽略规则:  

  • 忽略规则是对文件名有效的; A: 空行或#号开始的行,会被忽略; B: 可以使用通配符:  

 

 *        任意字符;
 ?        单个字符;
 [abc]    多种可能的字符a、b或c;
 [a-z0-9] 表示在某个范围内进行匹配;
 \        转义字符;
 !        表示取反(不忽略),写在某条规则的前面;

 

  • C: 路径分隔符"/";如果"/"后面的名称是个目录,则该目录以及该目录下的所有文件都会被忽略;如果"/"后面的名称是个文件,则该文件不会被忽略;  

例如: /name 如果name是个目录,则目录name和name下的所有文件都会被忽略;如果name是个文件,则该文件不会被忽略;  

  • D: .gitignore文件也可以忽略自己,只要把自己的名字写进来即可; E: 一条(行)忽略规则只对某一个目录下的文件有效,而对该目录下的子目录中的文件无效; F: 一条(行)忽略规则也可以只对单个文件有效(忽略单个指定的文件);  

例如:  

 

 *.pyc       #忽略所有以.pyc为后缀的文件;
 !lib.a    #不忽略文件lib.a;
 /tbkt     #只忽略此目录下tbkt文件,子目录的tbkt不被忽略;
 log/    #忽略log目录下的所有文件;
 doc/*.txt #只忽略doc/下所有的txt文件,但是不忽略doc/subdir/下的txt文件;

 

dd  

dd  

 

2.0.3. 如何移除一些文件

  

情景1:新添加一个文件,没有加入暂存区。  

 

 $ echo "try to delete">b.txt
 $ git st
 # 位于分支 master
 # Untracked files:
 #   (使用 "git add <file>..." 以包含要提交的内容)
 #
 #   b.txt
 nothing added to commit but untracked files present (use "git add" to track)
 $ git rm b.txt     # git rm:从已跟踪文件清单(暂存区)中移除。
 fatal: 路径 'b.txt' 未匹配任何文件
 $ rm b.txt        # 手动删除
 $ git st
 # 位于分支 master
 nothing to commit, working directory clean

 

情景2:修改了已有文件,没有加入暂存区  

 

 [beginman@beginman test]$ cat a.txt
 ok
 [beginman@beginman test]$ echo "Wow">a.txt
 [beginman@beginman test]$ cat a.txt
 Wow
 [beginman@beginman test]$ git st
 # 位于分支 master
 # 尚未暂存以备提交的变更:
 #   (使用 "git add <file>..." 更新要提交的内容)
 #   (使用 "git checkout -- <file>..." 丢弃工作区的改动)
 #
 #   修改:      a.txt
 #
 no changes added to commit (use "git add" and/or "git commit -a")
 [beginman@beginman test]$ git rm a.txt
 error: 'a.txt' 有本地修改
 (使用 --cached 保存文件,或用 -f 强制删除)

 

它会提示我们使用 --cached 保存文件,或用 -f 强制删除,如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f;另外一种情况是,我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中用 --cached 选项即可。  

 

 [beginman@beginman test]$ git rm --cached a.txt
 rm 'a.txt'
 [beginman@beginman test]$ ls
 a.txt  README.md
 [beginman@beginman test]$ git st
 # 位于分支 master
 # 要提交的变更:
 #   (使用 "git reset HEAD <file>..." 撤出暂存区)
 #
 #   删除:      a.txt
 #
 # Untracked files:
 #   (使用 "git add <file>..." 以包含要提交的内容)
 #
 #   a.txt

 

情景3:未修改已有文件  

 

 [beginman@beginman test]$ git rm README.md
 [beginman@beginman test]$ git st
 # 位于分支 master
 # 要提交的变更:
 #   (使用 "git reset HEAD <file>..." 撤出暂存区)
 #
 #   删除:      README.md
 #   删除:      a.txt
 #

  

 

2.0.4. 如何移动一些文件

  

 

  git mv file_from file_to
 # 相当于执行了下面三条命令
 $ mv file_from file_to
 $ git rm file_from
 $ git add file_to

 

比如如下操作:  

 

 [beginman@beginman test]$ mkdir do
 [beginman@beginman test]$ ls
 c.txt  do
 [beginman@beginman test]$ git mv c.txt do/abc.txt
 [beginman@beginman test]$ ls
 do
 [beginman@beginman test]$ ls do/
 abc.txt
 [beginman@beginman test]$ git st
 # 位于分支 master
 # 要提交的变更:
 #   (使用 "git reset HEAD <file>..." 撤出暂存区)
 #
 #   删除:      README.md
 #   重命名:    a.txt -> do/abc.txt
 #

  

 

2.0.5. 如何撤销一些文件

  

情景1.撤销最后一次的提交  

 

 $ git commit --amend
 git reset --hard commit_id (–hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容)

 

情景2.取消已经暂存的文件  

 

 git reset HEAD <file>. 

 

情景3.取消对文件的修改  

 

 git checkout -- <file>.
 
 
 
 
 
 
 

git使用规范

注意公司的git中username设置为姓名全拼、userEmail设置为公司邮箱

1. 任何一次git commit -m ""填写留言时,都请在留言的最前面加上“rm工单号码”,例如: git commit -m "rm1234: 重构xxx代码” 。

2. 使用git add时,请使用-p参数,这样可以强制检查要提交的修改,例如: git add -p . 。
3. 在完成同一个工单时,可能会多次commit同一个模块的内容,这样会造成git日志的重复以及日志里代码修改的分裂显示,这时候大家可以用 git commit --amend来解决, --amend这个参数可以将本次提交追加到上次提交里,并可以修改上次提交的message。请注意:只能对没有push的commit使用 git commit --amend命令,如果一个commit已经push到remote server,使用git commit --amend就会有非常大的概率造成代码冲突,所以请大家不要对已经push的代码使用git commit --amend命令。

 git commit 规范

大家好,

现在我们git代码库里的提交消息比较混乱, 经常出现类似“fix” “modify” 等无用的提交信息。我们需要规范git commit. 
我们参考了网上的一些资料,结合以前使用的一些要求,形成以下初步规范:

Why 为什么要有git commit规范?

  • 加快 Reviewing Code 的过程

  • 方便代码git blame时进行工单追踪

  • 5年后帮你快速想起来某个分支,tag 或者 commit 增加了什么功能,改变了哪些代码

  • 好的提交信息能帮助提高项目整体质量


commit 规范

  1. 使用git add时,请使用-p参数,这样可以强制检查要提交的修改,例如: git add -p .

  2. commit 消息一律使用中文, 提高可读性,大家英文水平不一,容易写错,也不易读懂。

  3. commit 消息前统一加上工单号, 格式为 "[rm工单号] 具体说明" 如 "[rm12345] 重构XXX代码"

    关于这点, 我们已经要求了很久, 但是执行结果还不是很理想,最近我们增加了一个脚本来自动完成这个工作, 请大家合并最新的develop获得该功能, 说明:

    原理: git 提供了若干hooks, 其中 prepare-commit-msg 可以修改提交信息. 唯一的问题是这些hooks不属于版本库(无法提交供团队使用)

    zhe800 中的解决办法是: 在加载rails development模式时,检查有没有.git/hooks/prepare-commit-msg如果没 有的话将软连接script/symbol_link_prepare_commit_msg.rb.git/hooks/prepare-commit-msg

    具体代码见config/environments/development.rb 中require(File.join(Rails.root, 'script/symbol_link_prepare_commit_msg.rb'))

    使用: 请 大家合并最新的develop, 然后rails c 或者手动执行./script/symbol_link_prepare_commit_msg.rb完成之后大家提交时无需再手动写入'rm工单号', 这一步就自动了, 这对于git commit -m XXX(inline提交) 和git commit(vi编辑提交内容) 都有效

  4. 在完成同一个工单时,可能会多次commit同一个模块的内容,这 样会造成git日志的重复以及日志里代码修改的分裂显示,这时候大家可以用 git commit --amend来解决

    --amend这个参数可以将本次提交追加到上次提交里,并可以修 改上次提交的message。

    请注意:只能对没有push的commit使用 git commit --amend命令,如果一个commit已经push到remote server,使用git commit --amend就会有非常大的概率造成代码冲突,所以请大家不要对已经push的代 码使用git commit --amend命令。

  5. 对于一个大的模块提交, 要是用完整提交模式(即 git commit 然后vi编辑message模式), 并注意格式:

    • 第一行是本次提交的简介,需要加上工单号,如feature分支应 该是 [rm12345], 然后空格(脚本自动),然后加上简介。应该少于50个字
    • 第二行是空行
    • 第三行开始是本次修改的详细情况,主要要说明这些问题:

      为什么这次修改是必要的?

      如何解决的问题?

      这些变化可能影响哪些地方?

  6. 请审核代码同学把commit信息作为审核内容之一

 
 
 
 
 
 
 
 
 
 
 
 
 
 

Pingbacks已打开。

Trackbacks

引用地址

评论
  1. JimGal JimGal 发布于 2020年11月30日 01:43 #

    <a href="https://internetpharmacysale.com/">pharmacy online australia free shipping</a> <a href="https://dexamethasonedexona.com/">dexamethasone tablets cost</a> <a href="https://sildenafilst.com/">generic viagra online mastercard</a> <a href="https://lyrica24.com/">buy lyrica 300 mg online</a> <a href="https://provigilrx.com/">order provigil from canada</a> <a href="https://levitrat.com/">buy levitra online usa</a> <a href="https://budesonidebudecort.com/">budesonide cost australia</a> <a href="https://kamagrat.com/">buy kamagra online uk</a>

  2. EvaGal EvaGal 发布于 2020年11月30日 02:11 #

    <a href="http://viagraup.com/">viagra cheap prescription</a>

  3. Cfnm Show Cfnm Show 发布于 2020年11月30日 02:52 #

    <a href="http://hdsexycams.com/">xxx chatrooms</a> <a href="http://chickwebcams.com/">adult sex chat</a>

  4. JimGal JimGal 发布于 2020年11月30日 03:46 #

    <a href="https://piroxicamfeldene.com/">feldene 10 mg capsules</a> <a href="https://piroxicam24.com/">feldene for sale</a> <a href="https://levitranorx.com/">levitra 20mg on line india</a> <a href="https://bviagra.com/">sildenafil tablets australia</a> <a href="https://viagraduo.com/">sildenafil 100 mg best price</a> <a href="https://tadalafilnova.com/">cialis 5mg sale</a> <a href="https://canadapharmacyshop.com/">canadian mail order pharmacy</a>

  5. AmyGal AmyGal 发布于 2020年11月30日 04:04 #

    <a href="https://onlinepharmacysale.com/">mexican pharmacy what to buy</a>

  6. SueGal SueGal 发布于 2020年11月30日 05:45 #

    <a href="https://orderantibiotics.com/">ceftin cheap</a> <a href="https://cialislm.com/">generic tadalafil 60 mg</a> <a href="https://sildenafilcitrateviagra.com/">where can you get generic viagra</a> <a href="https://tadalafilat.com/">cost daily cialis</a> <a href="https://onlinepharmacymay.com/">offshore pharmacy no prescription</a> <a href="https://dexamethasone365.com/">dexamethasone 2</a> <a href="https://sildenafilnsi.com/">how to buy viagra without prescription</a> <a href="https://retinoa.com/">retino</a> <a href="https://kamagrat.com/">compare prices kamagra</a> <a href="https://provigilmodafinil.com/">modafinil 100mg coupon</a>

  7. NickGal NickGal 发布于 2020年11月30日 06:10 #

    <a href="http://lyricaonline.com/">lyrica 150 mg cost</a> <a href="http://onlinepharmacymay.com/">online pharmacy meds</a> <a href="http://cialisbz.com/">tadalafil india 10 mg</a> <a href="http://mailpharmacyrx.com/">pharmacy wholesalers canada</a> <a href="http://cialismn.com/">cialis nz</a>

  8. DenGal DenGal 发布于 2020年11月30日 06:38 #

    <a href="http://budesonidebudecort.com/">budecort price</a> <a href="http://canadapharmacyshop.com/">gold pharmacy online</a> <a href="http://kamagrat.com/">kamagra purchase online</a> <a href="http://cialisbz.com/">cialis daily best price</a> <a href="http://levitravarde.com/">no prescription vardenafil</a>

  9. JaneGal JaneGal 发布于 2020年11月30日 08:08 #

    <a href="https://icepharmacy.com/">cheapest pharmacy prescription drugs</a>

  10. MarkGal MarkGal 发布于 2020年11月30日 09:46 #

    <a href="https://tadalafilok.com/">cialis 5mg for daily use</a> <a href="https://cialisos.com/">cialis drug prices</a> <a href="https://viagra40.com/">cheap viagra prescription online</a> <a href="https://piroxicamfeldene.com/">piroxicam</a> <a href="https://modafinil365.com/">cheapest modafinil generic</a>

发表评论