在进行git操作之前,首先得创建一个远程git仓库。由于你的本地Git仓库和远程Git仓库之间的传输是通过SSH加密的,所以,需要一点设置:
第一步: 创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开终端(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
你只要把邮件地址换成你git的邮件账号就可以了,然后一路回车,使用默认值就可以了,无须设置密码。
如果一切顺利的话,你就可以在根目录下看到.ssh的目录。里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以告诉别人,一般是会将公钥上传到远程的git仓库。
第二步: 在远程git配置公钥。
也就是将id_rsa.pub里的信息拷贝到SSH key的配置信息里即可。
这样你才可以将你本地的代码上传到远程库,这里的私钥对就是识别你的身份,确认这里的提交是你进行操作的。
一、将本地代码提交到远程仓库。
如果远程已经存在仓库 可以直接执行git clone +仓库地址
1. 首先得创建本地仓库。
可将项目拷贝到一个工程文件下,或直接在项目的主目录,创建git仓库。
通过cd到文件目录下,在终端执行git init,如果在已有的项目中存在了git仓库,可先删除相应的git文件,再进行创建。
git init
2. 关联远程仓库。
$ git remote add origin git@github.com:michaelliao/learngit.git(此仓库地址,会在创建仓库的时候生成,直接拷贝过来即可)。
3. 关联后,用git status查看仓库状态。然后再执行下面的操作。
git add .
git commit -m "提交说明"
最后再执行使用命令git push -u origin master第一次推送master分支的所有内容;
git push -u origin master
当你第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告:
The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?
这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。
查看远程仓库地址:
git remote -v
会得到下面的打印
origin git@gitlab.xxx.com.cn:xxx-folder/ios-app.git (fetch)
origin git@gitlab.xxx.com.cn:xxx-folder/ios-app.git (push)
仓库创建好之后,接下来就是开发者用的最多的操作,基本是每天都会用到。
二、分支管理。
1. 创建分支
//从拉取远程分支到本地
git fetch origin remoteBranchName
git checkout -b branchName origin/remoteBranchName
//创建新的本地分支
git branch branchName //创建分支
如, git branch dev //创建dev分支
查询本地绑定的远程分支:
git branch -vv
2. 切换分支。
git checkout -b dev_test //创建并切换到dev_test分支
Switched to a new branch 'dev_test'
git checkout 表示切换分支, -b 创建分支。相当于下面两条指令的合集。
git branch dev_test //创建分支
git checkout dev_test //切换分支
git branch 查看本地分支
git branch -a 查看所有分支
新版本的git建议使用 git switch命令来切换分支。
git switch dev //切换分支
git switch -c dev_home //创建并切换到dev_home分支
3 .删除分支
a. 本地分支删除
git branch -d dev_test //本地删除分支,你当前所处的分支不能是你要删除的分支(dev_test)。
如果无法删除终端会给出提示
error: The branch 'dev_search' is not fully merged.
If you are sure you want to delete it, run 'git branch -D dev_test'.
这时候你就可以执行 git branch -D dev_test 强制删除该分支。
b. 远程分支删除
git push origin --delete dev_test //将要删除的分支push到origin即可删除。
另一种方式就是,
git push origin :dev_test(本地已删除的分支名称,注意冒号后需要一个空格)。
4. 分支重命名。
git branch -m oldBranchName newBranchName
如我想将dev_test分支改名为dev_home分支。
git branch -m dev_test dev_home。
三、提交合并代码(stash、merge)
在每次提交代码前,都要查看仓库状态 git status。
- stash 暂存
git status
git diff //查看变化
git stash save "临时缓存"
git stash list //查看stash列表
git stash pop //恢复最近的一个stash
git stash pop stash@{1}//恢复指定的stash
git stash drop stash@{0} //移除第一个stash
git stash clear // 清除所有stash
git log //查看版本控制系统历史记录
commit 5c6ff84e9bcaad06d1c6ba7856487853d89b4fe1 (HEAD -> dev_search, origin/dev_search)
Merge: 4533a78def 7d3d9df828
Author: xxx001 <xxx001@pingan.com.cn>
Date: Sun Jan 19 15:19:09 2020 +0800
解决合并冲突提交代码
commit 7d3d9df8288d84aa5fd85a0061fefebe18c9664b (dev)
Merge: b19d5c8c2c 4aee5d5a43
Author: xxx001 <xxx001@pingan.com.cn>
Date: Sun Jan 19 14:42:38 2020 +0800
Merge branch 'dev' of ssh://code.paic.com.cn/git/carowner-ios into dev
- add ,commit
$ git add . //将所有文件添加到暂存区(stage),
$ git commit -m "首页弹出窗bug fix"。 // 执行git commit就可以一次性把暂存区的所有修改提交到分支。
修改commit提交的注释
修改最后一次的提交注释,这个最常见
git commit --amend 【第一行出现注释界面】
i //进入编辑界面
修改某次的注释
git rebase -i HEAD~2
四、版本回退
如果代码已经commit过,但是想去掉本次commit的状态,但又不想去掉最新本地修改的代码,可以执行
git reset origin/branchName //将本地代码状态回滚到commit之前,本地代码还在,但需要重新add commit
有时候想修改commit的描述说明也可用这种方法。
1 reset方式 (通过reset的方式,把head指针指向之前的某次提交,reset之后,后面的版本就找不到了)
每次提交代码都会有一个commitId:也就是提交记录id,所有的提交都可以根据提交记录id找到。
git reset --hard HEAD //回到当前提交的版本, 也就是上一次版本。
git reset --hard HEAD^ //回到上一次提交记录。
git reset --hard HEAD~100 //回到上一百个版本。
git reset --hard commitId //回到对应的commitId对应的版本。
强制push到对应的远程分支(如提交到develop分支)
git push -f -u origin develop
2.revert
这种方式不会把版本往前回退,而是撤销某一次提交,某次commitId之前和之后的提交都会保留。只是撤销某次提交,并生成一个新的commit。所以,你只需要让别人更新一下代码就可以了,你之前操作的提交记录也会被保留下来
操作步骤如下:
1、找到你误提交之前的版本号
2、git revert -n 版本号
3、git commit -m xxxx 提交
4、git push 推送到远程