git 脚本在开发中应用场景-CSDN博客
Git基础
-
Git基本运作流程
(1) workspace->index->Repository
本地写代码在workspace,add暂存到index,commit提交到本地Repository。多项目成员,每员对应本地仓库,各自代码互不干扰。
(2) checkout
切换Repository分支。版本控制重要功能,不同分支工作。 -
Git与SVN不同
SVN没本地仓库,只有集中服务器,所有操作与服务器进行,必须联网查看历史信息,进行版本控制,而Git有本地仓库,本地即全部版本历史信息,没有网络,只需提交本地仓库,之后Remote同步即可。 svn集中式依赖中心服务器。Git有去中心化特点,使用者平等,每人有完整版本库,每人的有各自修改后写入代码。使用者比较交换,同步。SVN和Git的关系类似C/S和P2P。
Git操作与使用
Github, Gitee云平台基于Git,担任托管代码服务器角色,与SVN中不一样,各主机关系平等。
Github还Gitee都需本地有Git,与云服务器同步,需Git通信。
- Git配置
(1) 安装Git下载安装Git: https://git-scm.com/download;配置用户名邮箱:git config --global user.name "your_name"git config --global user.email "your_email"生成SSH Key:ssh-keygen -t rsa -C your_email查看Key:open ~/.ssh将Key复制,是公钥,之后配置GitHub/Gitee
(2) 配置GitHub
在GitHub->settings->SSH keys,粘贴Key。Git与Github通信,每次同步不需登陆。 - Git操作
git init - - 初始代码仓git clone - - 克隆远程仓 PS:克隆时,自定义新项目名,命令末尾指定新名:$ git clone git://github.com/schacon/grit.git mygritgit add - - 修改放暂存区(Stage)git add file – 提交指定文件 git add . || git add -A – 提交所有文件 git add *.js – 提交所有.js文件 git add -f file – 强制添加 git diff - - 查看当前目录修改(#暂存区没文件时,git diff比较工作区文件与上次提交版本库文件。 #暂存区有文件时,git diff比较工作区文件与暂存区文件)git diff HEAD - - file – 比较工作区中文件与版本库文件差异。HEAD指当前版本,file指当前工作区文件。 git commit -m “message” - - 提交代码 git commit --amend -m [message] - - 用新commit,替代上次提交git rm - - 文件从当前目录删除(不保存删除文件)。从Git仓删除,但保留工作目录,即从跟踪清单删除,用git rm -r --cached readme.md PS:文件被提交版本库,永远不担心误删,恢复文件最新版,丢失最近一次提交修改内容。git log - - 查看历史记录,git log显示从最近到最远提交日志git log --graph – 查看分支合并图 git reflog - - 记录每次命令git remote - - 查看远程库git remote -v - - 显示克隆地址(对多远程仓有用)git remote add [short_name] - - 添加新远程仓git remote add origin < address > - - 关联远程仓git fetch [remote-name] - - 从远程仓抓数据到本地。git pull - - 更新git push [remote_name] [branch_name] - - 推送到远程仓 默认用origin和mastergit push -u origin master [-f] - - 第一次将本地库内容推送远程仓git remote show origin - - 查看远程仓信息git remote rename [old_name] - - 远程仓重命名git remote rm [remote_name] - - 删除远程仓git branch -d < name > - - 删除本地分支git tag - - 显示当前库标签git branch - - 显示当前所有分支。用–merged和–no-merged查看已经合并、未合并分支。git branch <branch_name> - - 创建新分支git branch -r - - 查看远程分支git checkout <branch_name> - - 切换指定分支git checkout -b <branch_name> - - 创建分支并切换分支git merge 合并分支 例: hotfix分支合并到master: git checkout master git merge hotfix 合并后用git branch -d hotfix删除分支。 如合并冲突,手工修改 加—no-ff参数用普通模式合并,合并后历史有分支,看出曾经合并,而fast forward合并看不出曾经合并。git checkout . --恢复上次提交状态git checkout --file - - 工作区修改全部撤销 file修改没放暂存区,撤销修改回到版本库状态; file已添加暂存区,又修改,撤销修改回到添加暂存区后状态。 git status – 显示工作目录和暂存区状态。哪些修改被暂存到, 哪些没被Git tracked。git status不显示已commit项目历史信息。git reset --hard HEAD^ - - #版本回退git reset --hard commitId - - 取消回退,commitId回到未来版本号 PS:Git知当前版本,HEAD表当前版本,上一版本HEAD^,回退早时写成HEAD~100。 git stash - - 储藏工作目录中间状态——修改过被追踪文件和暂存变更——并保存到未完结变更堆栈,可重新应用。 切换分支,但不提交进行中工作;所以储藏变更。往堆栈推送新储藏,运行git stash。把未提交修改(暂存和非暂存)保存,后续恢复当前工作目录。 PS:stash本地的,不通过git push上传到git server。git stash list - - 查看所有储藏,git stash多次保存工作进度,恢复时选择。git stash pop [–index] [ < stash > ] - - 重新应用已实施储藏(删除储藏)如不用参数,恢复最新工作进度,将恢复工作进度从存储工作进度列表清除。 如提供< stash>参数(来自git stash list显示列表),从< stash>恢复。从进度列表删除< stash>。 选项–index除恢复工作区文件外,还尝试恢复暂存区。 git stash drop [< stash >] - - 删除存储进度。(默认删除最新进度)git stash clear - - 清空当前所有stashgit stash branch < branchname > < stash > - - 基于储藏进度创建分支。
Git案例与心得
- 场景一:本地建工程
工程目录:git init 本地库状态:git status
本地添加工程文件:git add HomeWork/Git使用心得体会.md
放暂存区(Index),如下Staged Changes:
提交本地库(Repository):git commit -m "add HomeWork/Git使用心得体会.md"
版本控制:
"git.md"四次修改,第i次版本,内容"version i",每次提交。
git log提交记录:
恢复到版本2:git reset --hard HEAD^^ 退到version 2:
git reset —hard HEAD^^/HEAD~100/commit-id/commit-id
回至version 4,查看commit-id:git reflog,用reset。
像链表操作,HEAD即指针,移动切换版本。 - 场景二:与远程库交互
先拉取GitHub内容与自己合并,再提交GitHub,减少冲突,仍不完全避免冲突。如直接push,冲突概率大,你写代码时,同事提交修改代码,而你写和他不同。所以先pull,因远程仓是一段时间后“达成共识”,拉取基本没错,比较过提交各方代码后确定下暂时版本。拉取后,有冲突,本地修改,解决冲突部分,不直接提交远程,致远程代码混乱,使各成员失去标准参照版本。
拉取(fetch/clone 或 pull)
第一次,fetch/clone。否则git pull [远程仓库名] [要拉取的分支]
再push即merge远程和本地两不同分支
注:同分支里某版本对上版本增量补丁,记录不同行对比差异(line diff)。 - 场景三:团队协作
团队成员各负责不同功能块,各占分支,各自本地仓,自己master和branch,branch下更多branch,最后将自己分支合并到自己master,再提交服务器。合并分类
(1) 快进式合并
分支和主线合并成一条时间线,如图:
(2) 多分支:git merge --no-ff mybranch
分支合并图像有向无环活动图。带箭头有向边相当于活动,图点相当于事件,或者版本。多人合作,并行进行,效率取决于关键路径长短,即有人进度落后,不能按时合并期望版本。 - 场景四:GitBase
pull再push,pull实际将两分支(本地分支和服务器分支)merge,两条分支线:
另外方法,让分支历史没经任何合并,用 git rebase:gitbase原理:
"mywork"分支(commit)取消,临时 保存为(patch)(补丁放".git/rebase"目录),"mywork"分支更新 为最新"origin"分支,保存补丁应用"mywork"分支。当"mywork"分支更新后,指向新建提交(commit),老提交丢弃。
冲突的解决:
rebase过程,出现(conflict). 停止rebase并解决冲突;解决后,用git-add更新内容索引(index), 无需执行git -commit, 只执行:
git rebase --continue
继续应用(apply)补丁。
用--abort参数终止rebase行动,且"mywork" 分支回到rebase开始前状态。
git rebase --abort
- 场景五:Fork + Pull request
向开源项目贡献代码,需先fork仓库(即拷贝),写完自己代码后,发起Pull request给原仓,原仓所有者决定要merge。
如,github上fork一个gitignore项目,很多写好.gitignore文件:
仓库进自己的,如有添加或修改代码,点击Pull request:
提交后,原仓Pull request看到提交:
联系方式
手机:13822161573 微信:txsolarterms QQ:419396409