Git使用学习

  • 篇中代码片"filename"替换为真实文件名时不带引号
  • 篇中代码片"DevName"替换为真实分支命名是不带引号
  • 篇中提交命令中"meaasge"替换为真实的信息描述时仍带引号

一. Git开始

1.1 设置账户

设置自己的账户, 参数--global表示这台机器上所有的Git仓库都会使用这个配置.
最后一条指令可以查看账户.

>> git config --global user.name "Aokai"
>> git config --global user.email "email@example.com"
>> git config list

说明1. Git是将每个版本独立保存的.

1.2 Git管理模式

故而文件有三种状态:
  • 已修改 (modified)
  • 已暂存 (staged)
  • 已提交 (committed)

二. Git初始化

2.1 建立本地仓库

在项目文件下运行命令行:

>> git init

2.2 添加文件暂存

>> git add "filename1" "filename2"
>> git add .                             // 快捷添加所有文件

2.3 提交到仓库区

>> git commit -m "a message string to explain this commit"

2.4 查看状态

当提交完成, 工作区/暂存区/仓库区 内容一致, 显示如下:

>> git status
On branch master
nothing to commit, working tree clean

三. 版本控制

3.1 从仓库恢复到暂存

从仓库区恢复到暂存区 :

>> git reset HEAD
>> git reset HEAD "filename1" "filename2"

接着2.4章节, 再添加一个文件file2.txt (未跟踪 Untracked) :

>> git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        file2.txt

nothing added to commit but untracked files present (use "git add" to track)

使用git add file2.txt添加文件 (未提交) , 暂存区与仓库区不同的status:

>> git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   file2.txt

3.2 从暂存恢复到工作区

从暂存区恢复文件 :(危险命令)

>> git checkout -- "filename"        // 格式
>> git checkout -- file2.txt         // 示例

如果修改文件还未暂存, 暂存区与工作区不同的status.

>> git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   file2.txt

no changes added to commit (use "git add" and/or "git commit -a")

如果想放弃暂存区内容, 使用git add "filename"添加暂存就好.

3.3 版本回退

指令示意图:

回滚到仓库区之前版本

>> git reset HEAD~                  // 回退到上个版本
>> git reset HEAD~~                 // 回退到上上个版本
>> git reset HEAD~2                 // 同上, 回退到上上, 多~的快捷写法
>> git reset commitID               // 在git log可看每次的commitID, 只输入前几个字符即可
>> git reset commitID "filename"    // 回滚个别文件, 将不影响HEAD指针

命令get reset的三种不同参数, 第一种是默认操作, 第三种是危险操作:

格式1: git reset --mixed HEAD~
– 移动HEAD, 将其指向指定版本
– 将HEAD移动后指向的版本, 恢复到暂存区

格式2: git reset --soft HEAD~
– 移动HEAD, 将其指向指定版本 (无其他)

格式3: git reset --hard HEAD~
– 移动HEAD, 将其指向指定版本
– 将HEAD移动后指向的版本, 恢复到暂存区和工作区

3.4 使用git checkout从仓库恢复文件

一般git checkout用于切换分支, 但切换同时会覆盖暂存区和工作区, 等效于恢复了文件.

>> git checkout master         // 根据分支名切换
>> git checkout commitID       // 根据快照ID切换

对比于git reset commitID直接覆盖工作区, 使用git checkout commitID时会先检查当前状态是否为"clean".
再者, 命令git reset commitID会移动HEAD所在分支的指向, 而git checkout commitID只会移动自身指向.
例如 : 当前(HEAD->master) 使用git reset --hard dev2, 则会将HEAD/master同时指向的分支dev2所在版本快照. 如果操作前master指向的版本不在dev2版本graph上, 该操作可能造成原master版本快照的丢失.

3.5 查看仓库区状态

从近到远依次展示仓库区 信息有 Author/Date/Message/commitID.

>> git log

命令git log只能查看当前commitID以及此版本之前的commitID.
已丢失commitID的查找方法, 使用git reflog可查看最近所有 HEAD 的改动, 既可找回想要挽救的 commitID.

四. 版本内容对比

  • 暂存区与工作区 比较
>> git diff
// 多行浏览时 按h帮助, 按q退出.
  • 仓库区与工作区 比较
>> git diff commitID
  • 仓库区与暂存区 比较
>> git diff --cached commitID
  • 仓库区不同版本 比较
>> git diff commitID1 commitIG2 

命令汇总关系图:

五. 提交指令参数

5.1 修改版本Message

>> git commit --amend                 // 进入vim模式修改说明
>> git commit --amend -m "message"    // 以新的message提交覆盖上一次版本信息

5.2 删除文件恢复

>> git checkout -- "filename"

// 使用 git status 查看已删除文件名 // 注意务必指定filename, 否则会影响其他文件

5.3 删除文件 取消跟踪

>> git rm "filename"

该命令同时删除工作区与暂存区的文件, 不修改任何仓库区, 其意思是取消跟踪, 下次提交不纳入版本管理; 若之前已有提交, 则在上一个版本快照中仍有保存.
特殊情况1: 暂存了一个文件后, 此时暂存区与工作区该文件相同; 若只想删除暂存区文件, 这意味着取消跟踪

>> git rm --cached "filename"

特殊情况2: 暂存了一个文件后, 修改文件, 此时暂存区与工作区该文件不同; 执行git rm会有提示

>> git rm file3.txt
error: the following file has staged content different from both the
file and the HEAD:
    file3.txt
(use -f to force removal)

使用git rm -f file3.txt会暴力同时删除暂存区与工作区该同名文件.

5.4 重命名文件

>> git mv old_filename new_filename

此命令对应了三步操作:

  1. 重命名 ren/mv old_name new_name
  2. 删跟踪 git rm old_name
  3. 填文件 git add new_name

六. 分支管理

6.1 创建分支

>> git branch "DevName"
>> git log --decorate                     // 显示HEAD指针位置
...(HEAD -> master, dev1)...

6.2 切换分支

>> git checkout "DevName"  
>> git log --decorate --oneline           // git log的精简显示
...(HEAD -> dev1, master)...
  • 注意git checkout切换分支会更改当前工作区内容.
  • 使用git checkout -b dev1 可创建的同时 切换到新的分支
  • 使用git branch 可简略查看分支

6.3 删除分支

>> git branch -d "DevName"
>> git branch --delete "DevName"

命令是删除分支指针, 但版本快照还是存在的.

6.4 查看分支及版本

>> git log --decorate --oneline --graph --all
>> git log --decorate --all --oneline --graph
* f3295d5 (HEAD -> master) add file4_for_master.txt
| * 3cd707a (dev1) add file4_for_dev1.txt
|/
* 12c61d5 4.add a new file3.txt
* b2a2b5c 3.the second change for file2.txt
* 7cc38ca 2.add other file name: file2.txt

6.5 合并分支

>> git merge dve1
  • 将分支dve1合并到当前HEAD分支, 若HEAD指向master则就是把dve1合并到master.
  • 情况一: 若dve1分支与master分支有同名文件但内容不同, 合并会失败.
  • 情况二: 若dve1较master新增了其他文件, 则合并会把所有新文件添加进来, 创建新的版本快照.
*   9e488d5 (HEAD -> master) Merge branch 'dev1'
|\
| * 3cd707a (dev1) add file4_for_dev1.txt
* | f3295d5 add file4_for_master.txt
|/
* 12c61d5 4.add a new file3.txt
* b2a2b5c 3.the second change for file2.txt
* 7cc38ca 2.add other file name: file2.txt
  • 情况三: master在dve1版本之中, 则会直接将master指向新的, 即Fast-forward模式.
    不同于情况二, 该操作不会创建新的版本快照.
  • 情况四: dve1新增了文件, master删除了文件, 没做实验, 如有冲突可以参考情况一.

6.6 解决冲突

针对上一节合并时可能存在冲突, 加以说明.

>> git checkout master
>> git merge dve1           // 会报告冲突
>> git status               // 查看冲突文件 "Unmerged", 需手动修改该文件

>> git add  conflictfile
>> git commit -m "merged_message_log"

当将dve1合并到当前分支存在冲突, Git用 <<<<<<<,=======,>>>>>>> 标记出不同分支的内容, 需要手动打开文件进行修改并提交, 合并成功后创建有新快照.

6.7 rebase合并

时间来不及这里没有仔细学, 有帅锅莫烦的讲解rebase 分支冲突 .

七. 匿名分支

7.1 HEAD和分支指针不在一起

>> git checkout HEAD~
>> git log --decorate --oneline --graph --all
* f570f2a (master, dev2) dve2: rm ReadMe.txt
*   9e488d5 (HEAD) Merge branch 'dev1'
*   9e488d5 (HEAD) Merge branch 'dev1'
|\
| * 3cd707a (dev1) add file4_for_dev1.txt
* | f3295d5 add file4_for_master.txt
|/
* 12c61d5 4.add a new file3.txt

上述命令后, HEAD移动到前一个版本, 但master指向位置不变, HEAD与master被分开. 该操作有个作用是可以将HEAD指向删除了分支指针的版本快照.

7.2 为匿名分支创建指针

>> git branch "NewDevName" commitID

在匿名分支情况下创建的快照, 当切换到别的分支时, 快照不会被显式保存, 除非记得commitID不然找回.

八. Github入门

创建账户以及添加SSH认证等不多说了, 之前已经搞过, 这里直接进入使用.

8.1 在Github上创建仓库

  • 网站主页寻找New repository入创建界面.
  • 创建完成查看仓库网址
    刚创建完界面或者点击Clone and downloads查看, 样例:
    SSH git@github.com:CoderAokai/Just_a_new.git
    HTTPS https://github.com/CoderAokai/Just_a_new.git

8.2 关联仓库与推送

  • 创建与本地关联
    在本地已经 git init 的文件下, 运行:
    >> git remote add origin git@github.com:CoderAokai/Just_a_new.git
  • 推送到Github云端
    >> git push -u origin master
    其中参数 -u 第二次推送可以省略, origin是在上一步中设置的云端仓库的简称, master表示推送的分支名. 也可以设置推送其他分支 :
    >> git push -u origin dev2

8.3 从远端读回某个版本

  • 从云端恢复
    >> git reset --hard origin/master
  • 从云端克隆文件夹
    >> git clone https://github.com/CoderAokai/Just_a_new.git
  • 从云端取回文件(包括更新)
    >> git pull origin master
    其指令等效于:
    先获取git fetch origin, 再合并git merge origin/master

8.4 远程一些错误

  1. 创建关联时失败
    添加失败时, 可能要用到移除关联:
    >> git remote rm origin
  2. 推送失败 push
    有时候error:failed to push som refs to, 可能需要先pull:
    >> git pull origin master
  3. 下拉失败 pull
    如果合并了两个不同的开始提交的仓库, Git会提示失败. 因为 github 的仓库和本地的没有一个共同的 commit 所以git通不过, 认为是写错了origin. 如果确定可用则使用如下指令:
    >> git pull origin master --allow-unrelated-histories

版权说明: 本文是 <网易云课堂-Git实用教程><Git教程 - 廖雪峰的官方网站> 的学习笔记, 使用图片来自课程截图, 图片版权归课程提供商及原作者所有, 转载请注明出处.


非显示图片<>


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值