Fork me on GitHub

git操作

Git

Git基本操作

查看版本库状态:
git status
增加文件到暂存区:
git add test.txt

查看文件具体修改:
git diff test.txt
增加文件到暂存区:
git add test.txt
提交版本到分支:
git commit -m "change Git to git"
可以再次查看状态:
git status

  • 查看历史状态
    • git is a version control system.

    • git is free software.

    • git is good.

增加文件到暂存区:
git add test.txt
提交版本到分支:
git commit -m "add new line git is good"

...重复以上步骤保存文件的多个版本...

查看历史版本:

​ git log
​ 或
​ git log --pretty=oneline

回滚版本

​ git reset --hard HEAD^
在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD ^ ^ ,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
也可以通过版本包跳转版本,比上一种写法好的地方在于可以跳转到已经被回退的版本上:
​ git reset --hard 5527510751b4303390bb4f321bfa8b7f997cbfd0
​ 或简写为
​ git reset --hard 55275
但是问题是如知道版本号呢?可以通过如下命令查看之前所有提交对应操作及版本号:
​ git reflog

撤销更改

  • 尚未增加文件到暂存区:
    修改test.txt
    git is a version control system.
    git is free software.
    git is good
    git is easy to use
    git is really useful
    boss is stupid
    撤销修改 -- 将文件恢复到最近一次add 或 commit之前的状态
    git checkout -- test.txt
  • 已经增加文件到暂存区,但尚未提交到分支:
    修改test.txt
    git is a version control system.
    git is free software.
    git is good
    git is easy to use
    git is really useful
    boss is stupid
    增加文件到暂存区:
    git add
    撤销修改 -- 把暂存区的修改撤销掉
    git reset HEAD test.txt
    撤销修改 -- 将文件恢复到最近一次add 或 commit之前的状态
    git checkout -- test.txt
  • 但这仅限于本地版本库,如果版本已经提交到远程版本库,则即使在本地做版本库中做回退,也无法取消在远程版本库中的记录。

删除文件

  • 从工作区中删除文件
    rm test.txt
    查看版本库状态
    git status
    增加删除文件操作到暂存区:
    git rm test.txt
    提交版本到分支
    git commit -m “描述”

  • 细节:Git跟踪并管理的是修改,而非文件。

GitHub远程仓库连接

  • 创建SSH Key
    $ ssh-keygen -t rsa -C "youremail@example.com"
    最终,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
    登陆GitHub,打开“Account settings”,“SSH Keys”页面,然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容

关联远程仓库

  • 本地关联到远程仓库:

     $ git remote add origin git@github.com:piaoqian/learngit.git
    

推送到远程仓库

  • 把本地库的内容推送到远程:
    $ git push -u origin master
  • 第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
    $ git push origin master

从远程仓库克隆

$ git clone git@github.com:piaoqian/gitskills.git

拉取版本

$ git pull <远程主机名> <远程分支名>:<本地分支名>

删除远程仓库关联

$git remote rm origin

分支

  • 创建分支:
    $ git branch dev

  • $ git checkout dev


  • $ git checkout -b dev //-b参数表示创建并切换

  • 用git branch命令查看当前分支:
    $git branch

  • 创建文件:
    test2.txt
    creating a new branch is quick.

  • 提交:
    $ git add test2.txt

  • $ git commit -m "branch test"

  • 切换回主分支
    $git checkout master0

  • 把dev分支的工作成果合并到master分支上。git merge命令用于合并指定分支到当前分支。此时采用的是快速合并策略。
    $git merge dev0

  • 合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:
    删除dev分支:
    $ git branch -d dev

  • 查看branch:
    $ git branch

分支之间合并冲突

  • 当多个分支之间的进行合并时,可能会产生冲突,需要对冲突解决后才能合并分支
    创建新的分支feature1
    $ git checkout -b feature1

  • 修改文件:
    test2.txt
    creating a new branch is quick and simple.
    在feature1分支上提交:
    $ git add test2.txt

  • git commit -m "AND simple"
    切换到master分支:
    $ git checkout master

  • 修改文件:
    test2.txt
    Creating a new branch is quick & simple.

  • 在master分支上提交:
    $ git add test2.txt

  • $ git commit -m "& simple"

  • 这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突:
    $ git merge feature1

  • Git告诉我们,test2.txt文件存在冲突,必须手动解决冲突后再提交。git status也可以告诉我们冲突的文件:
    $ git status
    修改如下后保存:
    Creating a new branch is quick and simple.

  • 再提交:
    $ git add test2.txt

  • $ git commit -m "conflict fixed"
    用带参数的git log也可以看到分支的合并情况:

  • $ git log --graph --abbrev-commit --pretty=oneline

  • 最后,删除feature1分支:
    $ git branch -d feature1
    冲突解决。

stash暂存分支

  • 当某一分支工作到一半,突然需要切换到其他分支时,可以通过stash机制将当前分支状态暂存起来,再在需要的时候恢复。
    创建新的分支dev
    $ git checkout -b dev

  • 修改文件:
    test3.txt
    today is a good day.
    加入文件:

  • $ git add test3.txt
    临时需要切换到其他分支,暂存当前分支:

  • $ git stash
    查看状态:

  • $ git status
    切换到dev2分支

  • $ git checkout master

  • $ git checkout -b dev2

  • 修改文件:
    test4.txt

  • happy every day
    加入文件:

  • $ git add test4.txt
    提交文件:

  • $ git commit test4.txt -m "add test4.txt"
    切换到master分支

  • $ git checkout master
    合并分支

  • $ git merge --no-ff -m "merged dev2" dev2

  • 切换回dev分支:
    $ git checkout dev

  • $ git status
    发现工作区是干净的,需要恢复暂存分支:

  • $ git stash list
    有两个办法:

  • 一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
    另一种方式是用git stash pop,恢复的同时把stash内容也删
    $ git stash pop

多人协作

  • 在多人使用远程仓库进行工作时,往往在同一个分支上的操作会存在冲突,此时需要远程冲突合并。
    多人协作的工作模式通常是这样:
    首先,可以试图用git push origin 推送自己的修改;
    如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
    如果合并有冲突,则解决冲突,并在本地提交;
    没有冲突或者解决掉冲突后,再用git push origin 推送就能成功!
    如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to origin/

标签

  • git中的版本都有版本编号,对代码的提交和回滚都是基于版本编号进行的,但是git中的版本编号是一串随机串,不好记忆,此时可以使用标签机制为某个提交增加标签,方便以后查找
    在当前分支当前提交上打标签:
    $git tag v1.0
    查看所有标签,默认标签是打在最新提交的commit上的:

  • $git tag
    如果想要打标签在某个指定历史commit上:

  • $ git tag v0.9 f52c633
    还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:

  • $ git tag -a v0.1 -m "version 0.1 released" 1094adb
    可以通过如下命令查看一个tag信息:

  • $ git show v0.1

  • 如果标签打错了,也可以删除:
    $ git tag -d v0.1

  • 如果要推送某个标签到远程,使用命令git push origin
    $ git push origin v1.0

  • 或者,一次性推送全部尚未推送到远程的本地标签:
    $ git push origin --tags

  • 如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
    $ git tag -d v0.9

  • 然后,从远程删除。删除命令也是push,但是格式如下:
    $ git push origin :refs/tags/v0.9

别名

  • 配置别名:
    $ git config --global alias.st status

  • $ git config --global alias.co checkout

  • $ git config --global alias.ci commit

  • $ git config --global alias.br branch

  • 删除别名:
    找到[user_dir]/.gitconfig 文件
    找到[alias]标签,删除其中别名

posted @ 2021-06-03 10:51  雨梦Coder  阅读(39)  评论(0)    收藏  举报