git命令

git命令参数

git archive --output dist.zip commitID <目录或文件> 打包

git branch 查看所有分支
git branch -d [分支名] -D 强制删除
git blame file 查看某个代码文件每行都是谁写的

git checkout file 撤销工作区修改回到最近一次的git commit或git add
git checkout -b [分支名] 此命令相当于git branch [分支名] 和 git checkout [分支名] 两个命令
git checkout -b [分支名] origin/[分支名] 创建并切换到新分支,新分支的内容从远程分支上拉取
git checkout main -f 丢弃掉当前分支在工作目录的内容,并切换到main分支
git clone [远程仓库地址]
git commit -m [注释]
git commit --amend 修改最后一次的注释,不加注释则表示把最近修改追加到最后一次提交

git diff-tree commitID --name-only -r --no-commit-id 对比输入的commitID和其前一次提交的差异

git log --graph 可看到分支合并图
git log --oneline 一行情书版日志
git log --pretty=oneline --abbrev-commit
git log --author=authorName --oneline 查看某人提交记录

git merge [分支名] 把参数中的分支修改合并到当前分支
git merge --no-ff -m [注释] [分支名] 把合并的信息当作commit提交记录下来

git pull <远程主机名> <远程分支名>:<本地分支名>
git push -u origin main 第一次推送main分支的所有内容
git push origin main 第二次及以后推送main分支上的内容
git push -f origin main 强制推送main分支上的内容,本地仓库完全覆盖远程仓库(有些git系统不支持,具有风险性)
git push origin --tags 一次性推送所有标签到远程仓库
删除远程仓库标签经过两步:
①git tag -d [标签]
②git push origin :refs/tags/[标签]

git rm 删除一个文件
git reflog 记录历史命令
git remote 查看远程仓库
git remote -v 查看远程仓库详细信息
git remote add origin [远程仓库地址]
git remote set-url origin [url] 重置远程仓库信息
git reset --mixed 默认,把档案留在工作目录
git reset --soft 會把档案跟目录留在暂存区
git reset --hard 抛弃变化
reset不论是哪个参数,不仅HEAD位置会变,git历史记录也会有变化。
git reset ORIG_HEAD --hard
这个 ORIG_HEAD 会记录最近危险操作(例如 reset、rebase、merge 等操作)之前的纪录点,但只会记录最后一次。所以万一不小心被洗掉的话,可以再去翻一下 git reflog。

git show commitID 显示某次提交的详细信息
git status
git stash
git stash list 查看所有stash
git stash apply 恢复
git stash drop 删除stash
git stash pop 恢复并删除stash

git tag 查看所有表签
git tag [标签]
git tag [标签] [commitID] 为某个commitID打上标签
git tag -d [标签] 删除标签

常见操作的场景

  1. 撤销修改说明
    ① 未add git checkout --file 或 手动删除工作区修改 工作区clean 暂存区clean
    ② add git reset HEAD file (将暂存区修改删除) 暂存区clean 工作区wait add
    git checkout --file (暂存区恢复到工作区) 工作区clean 暂存区clean
    ③ add commit git reset --hard HEAD^ (版本回退) 工作区clean 暂存区clean

  2. git 一个分支完全覆盖另一个分支
    git checkout main // 切换到旧的分支
    git reset --hard develop // 将本地的旧分支 main 重置成 develop
    git push origin main --force // 再推送到远程仓库

  3. 空项目推送到git上
    git init
    git remote add origin [远程地址]
    git add . && git commit -m "注释"
    git push -u origin main

  4. 拉取submodule
    git submodule update --init --recursive

  5. git add 忽略文件
    1)忽略文件: git update-index --assume-unchanged filename
    2)取消忽略文件: git update-index --no-assume-unchanged filename

  6. 将远程库的单个文件回退到某一版本
    工作区 - 暂存区 - 本地仓库区

  • 1)git log demo.js
  • 2)git reset [回退到的commit id] demo.js 将本地仓库库和暂存区中的文件回退到历史版本
  • 3)git checkout demo.js 暂存区中文件的历史版本覆盖工作区中对应的文件
  • 4)git add commit push 正常提交
  1. dev merge main后revert,然后dev和main都有新的提交,dev如何merge main?
    - git rebase -i [startpoint]  [endpoint] # [startpoint] [endpoint]是前开后闭的区间,[endpoint]一般是省略不写的,默认从起始的commit一直到最后一个commit,如果写了[endpoint],那么[endpoint]后面的commit就全都不要了
        - 进入交互,第一个pick不动,其他的改为s,从上到下提交的时间是从早到晚,然后x保存退出,这样多个commit记录就合并了
        - 然后会进入到log合并界面,除了第一个提交信息其他用`#`注释掉
       - 保存,使用git log --online查看修改情况
       - 如果远程分支在rebase前提交了则用git push -f强推,并记录本次提交commitA
    - git reset --hard commit_id # reset到dev merge main后的commit
    - git merge origin/main
    - git reverse commit_id # 此处的commit_id为dev merge main后revert产生的
    - git cherry-pick commitA的commit_id
    
  2. git describe
    git describe <ref>
    
    <ref> 可以是任何能被 Git 识别成提交记录的引用,如果你没有指定的话,Git 会以你目前所检出的位置(HEAD)。
    它输出的结果是这样的:
    <tag>_<numCommits>_g<hash>
    tag 表示的是离 ref 最近的标签, numCommits 是表示这个 ref 与 tag 相差有多少个提交记录, hash 表示的是你所给定的 ref 所表示的提交记录哈希值的前几位。
    

.gitignore 配置文件

  • 配置语法:

  以斜杠“/”开头表示目录;

  以星号“*”通配多个字符;

  以问号“?”通配单个字符

  以方括号“[]”包含单个字符的匹配列表;

  以叹号“!”表示不忽略(跟踪)匹配到的文件或目录;

  此外,git 对于 .ignore 配置文件是按行从上到下进行规则匹配的,意味着如果前面的规则匹配的范围更大,则后面的规则将不会生效;

  • 示例:

  (1)规则:fd1/*
     说明:忽略目录 fd1 下的全部内容;注意,不管是根目录下的 /fd1/ 目录,还是某个子目录 /child/fd1/ 目录,都会被忽略;

  (2)规则:/fd1/*
     说明:忽略根目录下的 /fd1/ 目录的全部内容;

  (3)规则:

 /*
 !.gitignore
 !/fw/bin/
 !/fw/sf/
说明:忽略全部内容,但是不忽略 .gitignore 文件、根目录下的 /fw/bin/ 和 /fw/sf/ 目录;

git配置

  1. 配置git用户名和邮箱
git config user.name "用户名"
git config user.email "邮箱"

在config后加上 --global 即可全局设置用户名和邮箱。

  1. 生成ssh key
ssh-keygen -t rsa -C "邮箱"
  1. git拉取代码的时候,会自动将代码中的换行方式转化成你当前系统的换行方式。
git config --global core.autocrlf false
  1. 对文件夹大小写敏感
git config core.ignorecase false --global

monorepo

  1. 初始化lerna init
  • package.json
{
  "name": "root",
  "private": true,
  "scripts": {
    "i": "lerna bootstrap",
    "dev:main": "lerna run dev --scope=main",
    "build:main": "lerna run build --scope=main"
  },
  "workspaces": {
    "packages": [
      "packages/*"
    ],
    "nohoist": [
      "main/**"
    ]
  },
  "devDependencies": {
    "lerna": "^5.1.4"
  }
}
  • lerna.json
{
  "packages": [
    "packages/*"
  ],
  "npmClient": "yarn",
  "useWorkspaces": true,
  "registry": "xxxx",
  "command": {
    "run": {
      "stream": true
    },
    "bootstrap": {
    }
  },
  "version": "independent"
}
  1. 导入存在的项目lerna import --flatten --preserve-commit /Users/xxx/code/old-project
posted on 2016-02-20 10:21  reamd  阅读(491)  评论(0编辑  收藏  举报