Git分支操作
创建名为dev的分支并切换到该分支
1.创建分支和切换分支
git branch <branch-name>
git git switch <branch-name> / git checkout <branch-name>
创建和切换分支
git switch -c <branch-name>/git checkout -b <branch-name>
查看分支
git branch -a
2.关联远程分支 例如:如果当前所在的分支还没有关联到远程分支,可以使用下面的命令为它们建立关联。
git branch --set-upstream-to origin/develop
如果需要为指定的分支关联远程分支,可以如下操作。
git branch --set-upstream-to origin/develop <branch-name>
当然,在创建分支时,如果使用了--track 参数,也可以直接指定与本地分支关联的远程分支,如下所示。
git branch --track <branch-name> origin/develop
如果需要解除本地分支与远程分支的关联,可以使用下面的命令。
git branch --unset-upstream <branch-name>
3.分支合并。例如在dev 分支上完成开发任务之后,如果希望将dev 分支上的成果合并到master ,可以先切回到master 分支然后使用git merge 来做分支合并,合并的结果如下图右上方所示。
git switch <target-branch>
git merge --no-ff <target-branch>
4.分支变基 分支合并操作可以将多个分支上的工作成果最终合并到一个分支上,但是再多次合并操作之后,分支可能会变得非常的混乱和复杂,为了解决这个问题,可以使用git rebase 操作来实现分支变基。如下图所示,当我们希望将master 和dev 上的工作成果统一到一起的时候,也可以使用变基操作。
当我们在dev 分支执行git rebase 命令时,将首先计算dev 分支和master 分支的差集,然后应用该差集到dev 分支,最后我们切回到master 分支并执行操作合并,这样就看到了如上图右下方所示的干净的分支
5.删除分支 删除分支可以使用git branch 加上-d 参数,如果分支上的工作成果还没有合并,那么在删除分支时会看到error: The branch '<branch-name>' is not fully merged. 这样的错误提示。如果希望强行删除分支,可以使用-D 参数。删除分支的操作如下所示。
git branch -d <branch-name>
error: The branch '<branch-name>' is not fully merged.
If you are sure you want to delete it, run 'git branch -D <branch-name>'.
git branch -D <branch-name>
如果要删除远程分支,可以使用下面的命令,但是请慎重的操作。
git branch -r -d origin/develop
git push origin :develop
或者
git push origin --delete develop
git其他操作
-
git fetch :下载远程仓库的所有变动,可以将远程仓库下载到一个临时分支,然后再根据需要进行合并操作,git fetch 命令和git merge 命令可以看作是之前讲的git pull 命令的分解动作。 git fetch origin master:temp
git merge temp
-
git diff :常用于比较工作区和仓库、暂存区与仓库、两个分支之间有什么差别。 -
git stash :将当前工作区和暂存区发生的变动放到一个临时的区域,让工作区变干净。这个命令适用于手头工作还没有提交,但是突然有一个更为紧急的任务(如线上bug需要修正)需要去处理的场景。 git stash
git stash list
git stash pop
-
git reset :回退到指定的版本。该命令主要有三个参数,如下图所示。 -
git cherry-pick :挑选某个分支的单次提交并作为一个新的提交引入到你当前分支上。 -
git revert :撤回提交信息。 -
git tag :经常用于查看或新增一个标签。
Git工作流程(分支管理策略)
既然Git是团队开发必备的工具,那么在团队协作时就必须有一个规范的工作流程,这样才能让团队高效的工作,让项目顺利的进展下去,否则工具再厉害但团队成员各自为战,冲突就会无处不在,协作更加无从谈起。我们仍然以刚才码云上创建的python 项目为例,来说明Git的分支管理策略。
Github-flow
-
克隆服务器上的代码到本地。 git clone git@gitee.com:jackfrued/python.git
-
创建并切换到自己的分支。 git switch -c <branch-name>
或 git checkout -b <branch-name>
-
在自己的分支上开发并在本地做版本控制。 -
将自己的分支(工作成果)推到服务器。 git push origin <branch-name>
-
在线发起一次合并请求(通常称之为Pull Request,有的地方称为Merge Request),请求将自己的工作成果合并到master 分支,合并之后可以删除该分支。
上面这种分支管理策略就是被称为github-flow或PR的流程,它非常简单容易理解,只需要注意以下几点:
master 的内容都是可以进行发布的内容(不能直接在master 上进行修改)。- 开发时应该以
master 为基础建立新分支(日常开发任务在自己的分支上进行)。 - 分支先在本地实施版本控制,然后以同名分支定期向服务器进行push操作。
- 开发任务完成后向
master 发送合并请求。 - 合并请求通过审查之后合并到
master ,并从master 向正式环境发布。
当然,github-flow的缺点也很明显,master 分支默认就是当前的线上代码,但是有的时候工作成果合并到master 分支,并不代表它就能立刻发布,这样就会导致线上版本落后于master 分支。
Python装饰器
import random
import time
from functools import wraps
def log_time(func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
ret_value = func(*args, **kwargs)
end = time.time()
print(f'{func.__name__}执行时间: {end - start:.3f}秒')
return ret_value
return wrapper
@log_time
def download(filename):
print(f'开始下载 {filename}.')
time.sleep(random.randrange(3, 7))
print(f'{filename} 下载完成.')
@log_time
def upload(filename):
print(f'开始上传 {filename}.')
time.sleep(random.randrange(5, 9))
print(f'{filename} 上传完成.')
if __name__ == '__main__':
download('Python从入门到住院.pdf')
upload('MySQL从删库到跑路.avi')
download.__wrapped__('Linux从精通到放弃.pdf')
|