开发利器(一):Git使用备忘

Git

目录

Git命令备忘表-官网

Git官方教程(所有不懂的先参考该文档)

注意事项

  • 本文档中部分指令–会显示为-,凡涉及到复制/查看命令,均应在编辑状态下完成
  • 如果修改了文档,没有git add ,直接git commit. 那么提交的文档是没有修改的,必须先git add 再 git commit
  • git merge命令用于合并指定分支到当前分支,merge之前,应该先add和commit相应文件
  • 推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上
  • 所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,对于二进制文件,只知道文件大小改变,但不知道改了什么

GIT 基础

  • 工作区(working directory): 就是你在电脑里能看到的目录
  • 版本库(Repository): 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD.
  • 把文件往Git版本库里添加的时候,是分两步执行的:第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
    在这里插入图片描述
STASH
  • 当手头工作没有完成时,需要去做其它工作时,可以先把工作现场git stash一下(工作区恢复到上次提交时的状态),去做其它事情,完成后再恢复。
  • git stash save “msg” ,可以在加入stash时增加备注信息,推荐使用该命令
  • 恢复有两个办法:一是用git stash apply恢复,恢复后,stash内容并不删除,需要用git stash drop来删除;另一种方式是用git stash pop,恢复的同时把stash内容也删了
  • git stash apply [stash-id] 恢复给定的stash,示例: git stash apply stash@{0}
  • git stash drop [stash-id] 删除给定的stash,如果没有给定则把最近加入的一个stash删除。示例: git stash drop stash@{0}
  • git stash list 列出所有的stash
  • git stahs show 显示该stash与当时提交该stash后工作区的状态(不是工作区的最新状态)相比被更改的文件
  • git stash clear 删除所有的stash
  • git stash branch [branchName] [stash-id] 创建并切换到一个新的分支,并将stash中的内容恢复到该分支上,由于需要切换到新分支,使用该命令前工作区需要commit或stash, 一般用于无法将内容恢复到原始分支中的情况,比如工作区内容大量更改导致恢复冲突。

GIT 基本操作

以下笔记如不特别说明,localRepository指本地版本库名字,remoteRepository指远程库名字

Git初始配置
git config --global user.name "username" # 例: user.name “wedgen”
git config --global user.email "email"
git config --global color.ui true # 在git命令中开启颜色显示
创建版本库
# 创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录:
$ mkdir localRepository
$ cd localRepository
$ pwd 
/Users/michael/localRepository  
$ git init
Initialized empty Git repository in /Users/michael/localRepository/.git/
添加文件到Git仓库
  • 分两步, 第一步,使用命令git add [file],注意,可反复多次使用,添加多个文件例:git add readme.txt
# different ways to add
$ git add  *.txt  #add all txt files in current directory
$ git add  "*.txt"   #add all txt files
$ git add  --all   #add all files
$ git add  docs/   #add all files in docs directory
$ git add  docs/*.txt   #add all txt files in docs directory
$ git add  -u  #add all modified file(NOT NEW)
$ git clean     #removing files that are not  under version control
  • 第二步,使用命令git commit,完成。
    • git commit -m "wrote a readme file"简单解释一下git commit命令,-m后面输入的是本次提交的说明,方便后面通过git log从历史记录里找到改动记录
    • git commit -a [-m “msg”] Commit all files changed since last commit , except untracked files. Remove files in that index that have been removed from workspace. 通过该命令可以省略git add命令直接提交(工作区也会被更改).相当于一个命令完成git add 和git commit操作

远程库操作

添加远程库
  • 新建远程库,使用命令git remote add [short-name] git@server-name:path/repo-name.git;添加一个新的远程 Git 仓库,同时指定一个你可以轻松引用的简写short-name
  • 或者git remote add [short-name] https://github.com/user/repo.git
  • 我使用的是 $ git remote add [short-name] git@github.com:junfireGitHub/remoteRepository.git 其中remoteRepository 是远程库的名字,必须先建立。
  • 如果添加的时候地址写错了,或者就是想删除远程库,可以用git remote rm <name>命令
  • Git支持多种协议,包括https,ssh支持的原生git协议速度最快
推送本地库
  • 关联后,使用命令git push remoteRepository(远程库名) branch-name (本地必须有对应的分支) 。 第一次推送master分支的所有内容; 如果使用git push remoteRepository(远程库名) branch-name 会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令,不需要提前在远程库中建立所push的分支,push之后,远程库中会自动生成。
  • 推送也可以用git push remoteRepository [branch-name]:[branch-name] Push new branch to remoteRepository repository with a different name.
推送失败解决方法
  • 如果提示push失败,则需要先用git pull试图合并;如果合并有冲突,则解决冲突,并在本地提交;没有冲突或者解决掉冲突后,再用git push remoteRepository branch-name推送就能成功!
  • git pull [remote-name] [branch],会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在分支。git pull 在大多数情况下它的含义是一个 git fetch [remote-name]紧接着一个 git merge [remote-name]/[branch]命令
克隆一个仓库
  • 首先必须知道仓库的地址,然后使用git clone命令克隆。
  • 我使用的 $ git clone git@github.com:junfireGitHub/gitskills.git 或者 git clone https://github.com/junfireGitHub/MultiObjectDetect.git 即网址加.git
  • 默认情况下,git clone 命令会自动设置本地 master 分支跟踪克隆的远程仓库的 master 分支(或不管是什么名字的默认分支)
  • 假设你的网络里有一个在 git.ourcompany.com 的 Git 服务器。 如果你从这里克隆,Git 的 clone 命令会为你自动将其命名为 origin,拉取它的所有数据,创建一个指向它的 master 分支的指针,并且在本地将其命名为 origin/master。 Git 也会给你一个与 origin 的 master 分支在指向同一个地方的本地 master 分支,这样你就有工作的基础。
从远程库中抓取与拉取
  • git fetch [remote-name] , 这个命令会访问远程仓库,从中拉取所有你还没有的数据。 执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。 它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。git fetch 后远程库的分支可以在本地通过[remote-name]/[branch-name]来访问
  • git pull [remote-name] [branch],会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在分支。git pull 在大多数情况下它的含义是一个 git fetch 紧接着一个 git merge 命令
对github 项目做出贡献
  • fork 别人的版本,然后将它克隆到本地,创建一个分支,修改代码,最后再将改动推送到 GitHub
  • 当你单击了“Create pull request”(创建合并请求)的按钮后,这个项目的拥有者将会收到一条包含关改动和合并请求页面的链接的提醒
  • github可以给项目添加合作者,这样大家都能往同一个项目中推送
多人协作

多人协作的工作模式通常是这样:

  • 多人协作的几种情况
  • 作为master如何维护项目
  • 首先,可以试图用git push remoteRepository(远程库名) branch-name推送自己的修改;
  • 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
  • 如果合并有冲突,则解决冲突,并在本地提交;
  • 没有冲突或者解决掉冲突后,再用git push remoteRepository branch-name推送就能成功!
  • 如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name remoteRepository/branch-name。
  • 查看远程库信息,使用git remoteRepository -v;
  • 从本地推送分支,使用git push remoteRepository branch-name,如果推送失败,先用git pull抓取远程的新提交;
  • 在本地创建和远程分支对应的分支,使用git checkout -b branch-name remoteRepository/branch-name,本地和远程分支的名称最好一致;
  • 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name remoteRepository/branch-name;
  • 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突
  • 当你的小伙伴从远程库clone时,默认情况下,你的小伙伴只能看到本地的master分支。现在,你的小伙伴要在dev分支上开发,就必须创建远程remoteRepository的dev分支到本地,于是他用这个命令创建本地dev分支:$ git checkout -b dev remoteRepository/dev 现在,他就可以在dev上继续修改,然后,时不时地把dev分支push到远程
其它
  • 查看远程库的分支: git branch -r
  • 创建绑定远程库的分支:git branch --track new remote/branch ,Create a new local branch that tracks a remote branch.
  • git remote -v 列出所有的远程库信息
  • 查看对远程库的操作信息, git remote show [remote-name], 会显示以下类似信息: Fetch URL: https://github.com/schacon/ticgit
  • 远程仓库的重命名,git remote rename pb paul #将远程库 pb 重命名为paul
  • 删除远程库, git remote rm [remote-name]

修改与回退、删除

查看修改
  • 掌握工作区(未add之前)的状态,使用git status命令(会显示工作区和index的差别,以及index和commit HEAD的差别,以及工作区哪些文件没有被跟踪)。如果git status告诉你有文件被修改过,用git diff可以查看修改内容。
  • 查看提交历史 : git log
  • git diff 查看修改内容
    • 工作区与暂存区差别:git diff
    • 暂存区与版本库差别:git diff - -cached
    • 工作区与版本库差别:git diff HEAD
    • 当前分支和某个分支的差别:git diff branch
    • 查看某个特定的文件的变化: 上述命令后面加 - - filename.xxx
撤销修改
  • 撤销工作区文件的修改:用命令git checkout - - fileName; git reset - -hard 撤销所有文件的修改
  • 撤销已添加到暂存区的某个文件的修改:第一步用命令git reset HEAD filename,可以把暂存区的修改撤销掉,然后git checkout - - fileName
  • 撤销已提交到版本库的修改:利用版本版本回退,不过前提是没有推送到远程库。
    • 首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,上N个版本是HEAD~N
    • 然后使用git reset命令:git reset - -hard commit_id; 例$ git reset - -hard HEAD^ 会回退到上一个版本
    • 用git log可以查看提交历史,以便确定要回退到哪个版本。要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
  • 重置本地库的所有更改(通过远程库) git resrt --hard [remoteRepository]/[branch-name] # Reset local repo and working tree to match a remoteRepository branch. Use reset ‑‑hard remoteRepository/master to throw away all commits to the local master branch. Use this to start over on a failed merge.
删除文件
  • 删除了某个文件,并且版本库中也希望删除: 先 rm test.txt删除工作区文件,然后用命令 git rm test.txt 删掉,并且git commit:
  • 错误删除工作区文件想要恢复:$ git checkout - - test.txtgit
  • 删除远程库的某个文件:git rm了本地repository的某个文件,如何也删除掉GitHub上的这个文件呢 ? 使用指令 git commit -a -m ( git commit -a -m “log_message” (-a是提交所有改动,-m是加入log信息) 本地修改同步至服务器端)即可, 或者在github上也可直接删除。
  • git clean: removing files that are not under version control

Git分支管理

  • 分支是在本地库里创建,工作区和暂存区永远只有一个,而本地库可以有多个分支
创建与合并分支
  • 查看分支:git branch
  • 查看远程库的分支: git branch -r
  • 创建分支:git branch [name]
  • 创建绑定远程库的分支:git branch --track [new_branch_name] [remote/branch] ,Create a new local branch that tracks a remote branch.
  • 切换分支:git checkout [name],切换分支后, 当前工作区的文件将变成对应工作区的文件
  • 创建+切换分支:git checkout -b [name]
  • 删除分支:git branch -d [name]
  • 删除远程分支:git push [remote-name] --delete [branch]
  • 强行删除: git branch -D
  • 合并某分支到当前分支:
    • git merge [branch-name](默认fastfoward不会有分支信息(即没有冲突),否则会有。合并分支时,加上–no-ff参数,always generate a merge commit合并后的历史有分支信息 ; use - -no-commit to to leave changes uncommitted). git merge branch可合并多个branch ,如git merge branch1 branch2 branch3…
    • 在当前分支上新建一个分支,在新分支上提交后,切换到当前分支来merge,则不会有冲突,因为merge是根据时间先后来的,merge后直接将当前分支往前移动到新分支即可
    • 冲突发生在当前分支上新建一个分支,在新分支上提交后;当前分支又提交了一个新的版本,然后在合并这两个分支时有可能两个分支更改了同一行,则git不知如何合并。
    • 冲突还发生在由当前分支创建两个分支的情况,然后在合并这两个分支时有可能两个分支更改了同一行,则git不知如何合并。
    • 如果有冲突,则需要解决冲突(文件中会有提示,自行编辑),然后git add 再commit 即可。
    • 如果合并后不满意,通过git merge --abort可以恢复到合并前状态。
  • git rebase,通过变基的方法来合并:
    • 只对尚未推送或分享给别人的本地修改执行变基操作清理历史,从不对已推送至别处的提交执行变基操作。
    • 通过rebase和merge的最终结果没有任何区别,但是变基使得提交历史更加整洁。 你在查看一个经过变基的分支的历史记录时会发现,尽管实际的开发工作是并行的,但它们看上去就像是串行的一样,提交历史是一条直线没有分叉。
    • 如果rebase过程中有冲突,则先手动修改冲突, 然后git add modified files , 最后 git rebase --continue
    • 一般我们这样做的目的是为了确保在向远程分支推送时能保持提交历史的整洁——例如向某个其他人维护的项目贡献代码时。 在这种情况下,你首先在自己的分支里进行开发,当开发完成时你需要先将你的代码变基到 origin/master 上,然后再向主项目提交修改。 这样的话,该项目的维护者就不再需要进行整合工作,只需要快进合并便可。
  • 合并给定的本地库到当前分支:git cherry-pick [commit-id]
分支管理
  • 冲突发生及解决
  • 冲突发生情况之一是在两个分支从一个节点衍生出来,但已经做了不同的更改,合并时就会有冲突。例如:merge分支上新建一个dev分支,然后merge分支和dev分支做了各自的修改并提交到版本库中。后面在merge上合并dev分支时,就会冲突当两个分支有相同的文件,比如README.txt , 并且不相同时则合并会发生冲突,必须解决后再提交
  • 查看分支合并图git log --graph ,推荐使用git log --graph --decorate --oneline --simplify-by-decoration 可以配置别名
  • 查看所有分支图 :
    • git log --graph --decorate --oneline --simplify-by-decoration --all #可以将该命令设置别名,git config --global alias.logAllBranch ‘log --graph --decorate --oneline --simplify-by-decoration --all’ , 然后只要输入git logAllBranch就可以了
    • 也可以使用命令, gitk --simplify-by-decoration --all
  • bug 分支:用于修复bug,修复好后合并。
  • Feature分支:软件开发中,总有无穷无尽的新的功能要不断添加进来。添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
  • 丢弃一个没有被合并过的分支 :通过git branch -D [name]强行删除

其它

标签管理(可以用于标示版本号,如v1.1.3)
  • 创建标签
    • 新建标签: 命令git tag [name],默认为HEAD(打在最新提交的commit上),也可以指定一个commit id;
    • 新建附注标签: git tag -a [tagname] -m “blablabla…”;
    • PGP签名标签: git tag -s [tagname] -m “blablabla…”;
    • 查看标签: git tag
  • 操作标签
    • 默认情况下,git push 命令并不会传送标签到远程仓库服务器上。 在创建完标签后你必须显式地推送标签到共享服务器上。
    • 推送一个本地标签: 命令git push remoteRepository [tagname];
    • 推送全部未推送过的本地标签: 命令git push remoteRepository --tags;
    • 删除一个本地标签: 命令git tag -d [tagname]可以删除一个本地标签;
    • 删除一个远程标签: 命令git push remoteRepository :refs/tags/[tagname],需要先删除本地标签。
  • 重命名文件和文件夹
    • git mv - Move or rename a file, a directory, or a symlink
忽略特殊文件
  • 忽略某些文件时,需要编写.gitignore;.gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理! 如何忽略某些文件
配置别名
  • $ git config --global alias.st status #注意alias后面的.必须加上,并且.和st间不能有空格,git st就表示git status了,配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
  • 每个仓库的Git配置文件都放在.git/config文件中,别名就在[alias]后面,要删除别名,直接把对应的行删掉即可。
  • 当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中:配置别名也可以直接修改这个文件,如果改错了,可以删掉文件重新通过命令配置。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值