git备忘录

409 阅读7分钟
  • SVN: 集中式的版本控制系统. 本地只有文件,没有版本库,所有的代码只在服务器上有版本记录,如果要进行版本的回退,和一些tag操作,必须经过服务器

  • Git: 分布式版本控制系统,每个人电脑就有版本库.写完代码,先提交到本地的版本,让后提交到服务器上,最后每个电脑都有一个最新的代码

      git也要配置服务器, 但是服务器的作用, 只是作为一个中间桥梁供开发人员去同步代码用的.
      git有机器强大的分支管理,把SVN等远远抛在了后面
    

1.远程仓库

  • 1.1 创建SSH Key. 在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。使用以下命令创建SSH Key:(替换成你的邮箱地址).

      $ ssh-keygen -t rsa -C "youremail@example.com"
    
  • 1.2 在用户主目录中找到.ssh目录,里面有id_rsa(私钥)和id_rea.pub(公钥),打开id_rea.pub并记录下来.

  • 1.3 登录GitHub,打开"Account settings","SSH Key"页面,添加Key,把id_rea.pub内容添加进去.

      git需要在GitHup,OsChina,GitLabel中添加自己的公钥
      由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,GitHub只要知道了你的公钥,就可以在每台电脑上往GitHub推送了.
    
  • 1.4 添加远程库 在GitHub上创建仓库,使用下面命令,把这个远程的仓库与本地已有的仓库进行关联,之后就可以把本地仓库的内容推送到GitHub仓库了,注意是SSH的,传输相比http稳定

      cd 到本地文件		
      $ git remote add origin git@github.com:WayThought/blog.git
      
      git remote  查看远程库的信息
      $ git remote origin或者,用git remote -v显示更详细的信息
    
  • 1.5 从远程库克隆(当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。)

      cd 到本地文件		
      $ git clone git@github.com:WayThought/blog.git
    

这样就把远程的仓库克隆到了本地

2.本地分支管理

git status: 查看文件的状态

git add : 提交有修改的文件,由工作区到暂存区

git add 文件名  添加指定修改的文件到暂存区
git add .  添加当前目录所有有修改的文件到暂存区

git commit : 提交暂存区的文件到本地版本库

git commit -m "注释" 文件名  提交指定的文件到本地仓库
git commit -m "注释"        提交所有的文件到本地仓库

(需要提交的改动文件,必须先add加到缓存区,再commit到版本区)

git pull和push命令是本地仓库和远程仓库(服务器)打交道的,一般在push之前都会先pull下代码,如果有冲突,解决完冲突再push

git pull 从服务器上更新代码到本地仓库,切换到本地需要提交的分支(dev)
git pull origin dev  把服务器远程仓库更新的代码拉到本地仓库

git push origin dev  把本地仓库的代码更新推送到服务器上

创建与合并分支(当前分支为master)

git branch  查看当前分支
git branch dev origin/dev 切换到分支dev
git checkout dev    切换到分支dev
git checkout -b dev   创建dev分支,然后切换到dev分支
git merge dev  把dev的工作内容合并到master上(分支A合并分支B,与分支B合并分支A是一样的)

3.版本回退※

正常回退:
git log  显示历史记录(写周报或者查看版本号)
git reflog 来记录你的每一次命令(版本回退后,可以找到上一个版本的commit id )
git reset --hard HEAD^ 回退到上一个版本
git reset --hard HEAD^^ 回退到上上个版本
git reset --hard HEAD 版本号 回退到指定的版本

如何找回删除的分支:
1. 通过git reflog 命令找到我们需要恢复的信息对应的commit_id (根据log 提交的日期时间)
2. 通过git branch 新分支名字 对应的commit_id 来建立一个新的分支,把丢失的东西恢复到新分支上

如何临时修复bug:
git stash 把工作区的内容暂时隐藏
git stash pop 把工作区的内容显示到当前分支

4.其他命令:

4.1 常用命令:
git config user.name # 查看用户名

git config user.email # 查看邮箱地址

git config --global user.name "Your Name"  # 提交名字

git config --global user.email you@example.com  # 提交邮箱

git rm <file>       # 从版本库中删除文件

git rm <file> --cached  # 从版本库中删除文件,但不删除文件

git reset <file>    # 从暂存区恢复到工作文件

git reset -- .      # 从暂存区恢复到工作文件

git reset --hard    # 恢复最近一次提交过的状态,即放弃上次提交后的所有本次修改

git stash list # stash 列表

git stash pop  # 恢复的同时把stash内容也删了

git checkout -- readme.txt # 把readme.txt文件在工作区的修改全部撤销

git checkout -- . # 把工作区的修改全部撤销

git reset HEAD filepathname   # 来放弃指定文件的暂存区内容

git reset HEAD .  	# 放弃所有暂存区内容

git diff master..远程仓库名字/master # 查看本地分支与远端分支的差异

git tag 标签名 commitId  # 添加tag

git push origin 标签名  # 将本地tag推到远程

git tag -d 标签名 # 删除本地tag

git push origin --delete 标签名  删除远程tag
4.2 常见问题:

4.2.1 git pull也失败了,原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接:

$ git branch --set-upstream dev origin/dev

4.2.2 将本地项目添加到远程的仓库

1.远程建立仓库,并克隆到本地(例如:storeHouse)
2.将本地的项目拷贝到storeHouse文件中
3.使用 git init 命令
4.使用 $ git remote add origin git@github.com:WayThought/blog.git 
5.git add . 
6.git commit 
7.git push 

4.2.3 将本地分支推送到远程分支:(如果远程分支不存在则会自动创建分支)

git push origin 本地分支名:远程分支名

4.2.4 远程分支版本的回退 切换到本地分支对应着的远程分支

git push origin HEAD --force #远程提交回退

4.2.5 删除远程分支

git push origin --delete 远程分支名

备注:如果删除远端分支后,合作的小伙伴需要git fetch -p 删除不存在的远程跟踪分支

4.2.6 强制覆盖分支

把本地的 develop 分支强制(-f)推送到远程 master

git push origin develop:master -f

5.0 冲突

5.1 常见冲突:
第一种: 项目可以打开,报错->直接去找,对别人的改动要进行沟通决定是否要保留
第二种: 项目打开失败
git status 查看哪个文件冲突(一般是配置文件)
open 路径 搜索"===“,删除后没有恢复的话 说明删除错误了 ->重新删除

<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1

上面那个是HEAD分支的,下面这个是feature1分支,沟通后决定保留或删除

5.2 pbxproj文件冲突

比较麻烦的一种冲突,企业开发经常会遇到project.pbxproj文件冲突的问题,project.pbxproj文件主要包含了以下几项主要信息:

1.工程文件关联信息, 如PBXBuildFile PBXFileReference
2.组织结构分类信息, 如PBXGroup
3.项目工程配置信息, 如XCBuildConfiguration XCConfigurationList

解决办法:

删除`====``>>>>``<<<<<<`,保留对应结构的`}``]`,简单来说就是保证对应PBXBuildFile、PBXGroup格式的正确性。
5.3 git push 报以下错误:
错误
error: RPC failed; result=22, HTTP code = 413
fatal: The remote end hung up unexpectedly
fatal: The remote end hung up unexpectedly
解决:
第一种. 将http切换成ssh,在git的config中修改url( changed it to the SSH address, and everything resumed working flawlessly)
第二种. 继续使用http,运行
	git config http.postBuffer 524288000
第三种。 git push -u origin 分支(这种没有亲自尝试过,可以试试)
		 

6.0 为什么GitHub需要SSH Key呢

因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。

7.0 下载的工程带有submodule

当使用git clone下来的工程中带有submodule时,初始的时候,submodule的内容并不会自动下载下来的。 此时,只需执行如下命令:

git submodule update --init --recursive

8.0 修改已经push的commit的信息

1.查看提交的历史记录

git log

2.使用git rebase -i HEAD~3确定要修改哪些commit

git rebase -i HEAD~3

HEAD~3表示最近的3个,后面的3可以改成其他数字

pick f429786 1
pick 880cfbc 2
pick c55cf56 3

假如我们需要修改第2条commit的message, 点击"i"键进行INSERT,将pick修改为edit,然后保存退出

pick f429786 1
edit 880cfbc 2
pick c55cf56 3

3.先使用git commit --amend,再使用git rebase --continue修改每个edit的commit

4.使用以下命令强制更新远程服务器

git push origin 分支名 -f

9.0 .gitignore

.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的

解决办法

$ git rm -r --cached .
$ git add .
$ git commit -m "update .gitignore"

注意前两条命令后面的“.”,我们需要使用rm命令清除下相关缓存内容,这样文件将以未追踪的形式出现,然后在重新添加提交一下,.gitignore文件里的规则就可以起作用了。

参考资料:廖雪峰的博客