git常用操作方法
1. Git配置
- 安装Git:https://git-scm.com/
- 本地命令行生成密钥绑定GitHub账号
# 输入命令生成密钥对,替换成自己邮箱,然后一路回车 ssh-keygen -t rsa -C "youremail@example.com" # 将生成的公钥打印出来复制,将这串文本复制粘贴到GitHub的Setting->SSH and GPG keys中 cat ~/.ssh/id_rsa.pub # 输入命令检查是否绑定成功,输入yes后,如果出现Hi,xxx!则绑定成功 ssh -T git@github.com
3. 配置用户名和邮箱信息:
# 查看配置信息,一开始为空 git config --list # 全局配置,对所有代码库生效 git config --global user.name "你的名字" git config --global user.email "你的邮箱" # 局部配置,只对当前的代码库有效 git config --local user.name "你的名字" git config --local user.email "你的邮箱" # 配置后,远程仓库提交的commit里对应的用户即为 user.name
2. Git基本概念
- 本地仓库:本地仓库上存放所有相关的文件,具体可分为工作区、暂存区和仓库区,工作区即项目文件夹下不包含
.git
文件夹的所有文件,暂存区和仓库区则在.git
文件夹下 - 工作区:即我们工作的文件夹,在里面进行文件的增删改操作
- 暂存区:临时保存工作区上的改动,通过
git add
操作将工作区的修改同步到暂存区 - 仓库区:当执行
git commit
操作时,将暂存区上的所有变动同步到本地仓库 - 远程仓库:GitHub/GitLab上保存的仓库,通过
git push
将本地仓库同步到远程仓库,也可以通过git fetch/pull
将远程仓库同步到本地仓库
3. Git基本操作
创建版本库
创建版本库有两种方式,一种是将本地的文件夹直接变成一个git仓库,另一种是直接将远程的仓库克隆到本地
git init # 将本地文件夹变为一个git仓库 git clone <url> #将远程仓库克隆到本地
修改与提交操作
git add <file> # 将单个文件从工作区添加到暂存区 git add . # 将所有文件添加到暂存区 git commit -m "messenge" # 将暂存区文件提交到本地仓库 git status # 查看工作区状态,显示有变更的文件。 git diff # 比较文件的不同,即暂存区和工作区的差异。
远程操作
git push origin master # 将本地的master分支推送到远程对应的分支 git pull # 下载远程代码并合并,相当于git fetch + git pull git fetch # 从远程获取代码库,但不进行合并操作 git remote add origin <url> # 将远程仓库与本地仓库关联起来 git remote -v # 查看远程库信息
撤销与回退操作
撤销操作:当修改了工作区/暂存区的文件,但是还没有commit时,想要撤销之前的操作:
# 场景1:当你改乱了工作区某个文件的内容,但还没有add到暂存区 git checkout <file> # 撤销工作区的某个文件到和暂存区一样的状态 # 场景2:当乱改了工作区某个文件的内容,并且git add到了暂存区 git reset HEAD <file> # 第1步,将暂存区的文件修改撤销掉 git checkout <file> # 第2步,将工作区的文件修改撤销掉 # 场景3:乱改了很多文件,想回到最新一次提交时的状态 git reset --hard HEAD # 撤销工作区中所有未提交文件的修改内容
回退操作:当已经进行了commit操作,需要回退到之前的版本:
git reset --hard HEAD^ # 回退到上次提交的状态 git reset --hard HEAD~n # 回退到n个版本前的状态 git reset --hard HEAD commitid # 回退到某一个commitid的状态 git reset --soft HEAD commitid # 回退到某一个commitid的状态,并且保留暂存区的内容 git reset --mixed(默认) HEAD commitid # 回退到某一个commitid的状态,并且保留工作区的内容
关于reset三种模式的说明:
4. Git分支管理
git的最强大之处就在于分支管理了,具体有两种应用场景:
- 多人协作:每个人都基于主分支创建一个自己的分支,在分支上进行开发,然后再不断将写好的代码合并到主分支
- 自己修复bug/增加feature:创建一个bug分支或者feature分支,写好代码后合并到自己的分支然后删除bug/feature分支
git branch <name> # 创建分支 git checkout <name> # 切换到某个分支 git checkout -b <name> # 创建并切换到新分支,相当于同时执行了以上两个命令 git merge <name> # 合并某个分支到当前分支中,默认fast forward git branch -a # 查看所有分支 git branch -d <name> # 删除分支
5. Git多人协作
首先,可以试图用git push origin <branch-name>推送自己的修改; 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并; 如果合并有冲突,则解决冲突,并在本地提交; 没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功! 如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。
6. 删除Git本地仓库
删除Git本地仓库的根本原理是删除“Git本地仓库”里面的根目录下面的隐藏文件夹“.git”
(1)方法1:自己手动删除掉“Git本地仓库”里面的根目录下面的隐藏文件夹“.git”(如上图所示)
(2)方法2:在本地仓库的目录下调用命令行删除根目录下的.git文件夹,输入
(3)检验是否成功删除了本地仓库:在Gitbash中进入仓库的目录中,如果目录末尾没有"(master)",说明成功删除了本地仓库
7.远程仓库管理
修改远程仓库地址:
git remote set-url origin <remote-url>
仓库路径查询查询:
git remote -v
添加远程仓库:
git remote add origin <你的项目地址> //注:项目地址形式为:https://gitee.com/xxx/xxx.git或者 git@gitee.com:xxx/xxx.git
删除指定的远程仓库:
git remote rm origin
8.本地初始化一个项目
首先,你需要执行下面两条命令,作为 git 的基础配置,作用是告诉 git 你是谁,你输入的信息将出现在你创建的提交中。
git config --global user.name "你的名字或昵称" git config --global user.email "你的邮箱"
然后在你的需要初始化版本库的文件夹中执行:
git init git remote add origin <你的项目地址> //注:项目地址形式
为:http://git.oschina.net/xxx/xxx.git或者 git@git.oschina.net:xxx/xxx.git
这样就完成了一次版本你的初始化。
如果你想克隆一个项目,只需要执行:
git clone <项目地址>
完成第一次提交
进入你已经初始化好的或者克隆项目的目录,然后执行:
git pull origin master
<这里需要修改/添加文件,否则与原文件相比就没有变动>
git add . git commit -m "第一次提交" git push origin master
然后如果需要账号密码的话就输入账号密码,这样就完成了一次提交。
此时,你可以在你的个人面板、项目主页查看到你的提交记录,例如:http://git.oschina.net/oschina/git-osc/commit/f3dd1c5bae48fa4244e2595a39e750e5606dd9be
按照本文档新建的项目时,在码云平台仓库上已经存在 readme 文件,故在提交时可能会存在冲突,这时您需要选择的是保留线上的文件或者舍弃线上的文件,如果您舍弃线上的文件,则在推送时选择强制推送,强制推送需要执行下面的命令:
git push origin master -f
如果您选择保留线上的 readme 文件,则需要先执行:
git pull origin master
修改gitignore之后所作的操作:
git rm --cached .gitignore git add .gitignore git commit -m 'update .gitignore'
使用远程代码强制覆盖本地代码:
git pull -f
远程分支删除,重命名
删除远程分支
在Git v1.7.0 之后,可以使用这种语法删除远程分支:
$ git push origin --delete <branchName>
删除远程tag
git push origin --delete tag <tagname>
否则,可以使用这种语法,推送一个空分支到远程分支,其实就相当于删除远程分支:
git push origin :<branchName>
这是删除tag的方法,推送一个空tag到远程tag:
git tag -d <tagname>
git push origin :refs/tags/<tagname>
两种语法作用完全相同。
删除不存在对应远程分支的本地分支
假设这样一种情况:
我创建了本地分支b1并pull到远程分支 origin/b1;
其他人在本地使用fetch或pull创建了本地的b1分支;
我删除了 origin/b1 远程分支;
其他人再次执行fetch或者pull并不会删除这个他们本地的 b1 分支,运行 git branch -a 也不能看出这个branch被删除了,如何处理?
使用下面的代码查看b1的状态:
$ git remote show origin * remote origin Fetch URL: git@github.com:xxx/xxx.git Push URL: git@github.com:xxx/xxx.git HEAD branch: master Remote branches: master tracked refs/remotes/origin/b1 stale (use 'git remote prune' to remove) Local branch configured for 'git pull': master merges with remote master Local ref configured for 'git push': master pushes to master (up to date)
这时候能够看到b1是stale的,使用 git remote prune origin
可以将其从本地版本库中去除。
更简单的方法是使用这个命令,它在fetch之后删除掉没有与远程分支对应的本地分支:
git fetch -p
重命名远程分支
在git中重命名远程分支,其实就是先删除远程分支,然后重命名本地分支,再重新提交一个远程分支。
例如下面的例子中,我需要把 devel 分支重命名为 develop 分支:
$ git branch -av * devel 752bb84 Merge pull request #158 from Gwill/devel master 53b27b8 Merge pull request #138 from tdlrobin/master zrong 2ae98d8 modify CCFileUtils, export getFileData remotes/origin/HEAD -> origin/master remotes/origin/add_build_script d4a8c4f Merge branch 'master' into add_build_script remotes/origin/devel 752bb84 Merge pull request #158 from Gwill/devel remotes/origin/devel_qt51 62208f1 update .gitignore remotes/origin/master 53b27b8 Merge pull request #138 from tdlrobin/master remotes/origin/zrong 2ae98d8 modify CCFileUtils, export getFileData
删除远程分支:
$ git push --delete origin devel To git@github.com:zrong/quick-cocos2d-x.git - [deleted] devel
重命名本地分支:
git branch -m devel develop
推送本地分支:
$ git push origin develop Counting objects: 92, done. Delta compression using up to 4 threads. Compressing objects: 100% (48/48), done. Writing objects: 100% (58/58), 1.38 MiB, done. Total 58 (delta 34), reused 12 (delta 5) To git@github.com:zrong/quick-cocos2d-x.git * [new branch] develop -> develop
然而,在 github 上操作的时候,我在删除远程分支时碰到这个错误:
$ git push --delete origin devel
remote: error: refusing to delete the current branch: refs/heads/devel To git@github.com:zrong/quick-cocos2d-x.git ! [remote rejected] devel (deletion of the current branch prohibited) error: failed to push some refs to 'git@github.com:zrong/quick-cocos2d-x.git'
这是由于在 github 中,devel 是项目的默认分支。要解决此问题,这样操作:
进入 github 中该项目的 Settings 页面;
设置 Default Branch 为其他的分支(例如 master);
重新执行删除远程分支命令。
把本地tag推送到远程
git push --tags
获取远程tag
git fetch origin tag <tagname>
本博客参考文章来源:
文章1:https://blog.csdn.net/zhezhebie/article/details/78761417
文章2:https://zhuanlan.zhihu.com/p/404642045