<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>cli &amp;mdash; csantosb</title>
    <link>https://infosec.press/csantosb/tag:cli</link>
    <description>Random thoughts</description>
    <pubDate>Fri, 17 Apr 2026 04:58:18 +0000</pubDate>
    <item>
      <title>git best practices</title>
      <link>https://infosec.press/csantosb/git-best-practices</link>
      <description>&lt;![CDATA[img br/&#xA;We said #git, then. How to use git as efficiently as possible in #modernhw ? We know the answer, using a front end. Right, but then ? Following a set of simple principles and best practices that will make your life simpler. Follow me on this trip. !--more-- br/&#xA;&#xA;read a couple of good references&#xA;&#xA;Pragmatic Version Control Using Git, Version Control with Git, 3rd Edition and Pragmatic guide to git are good examples, but there are many more around. Use them as a reference and as a starting point, and try to go beyond following your needs. br/&#xA;Check the official doc. And remember you have man git-log, man git-config, etc. at your disposal. br/&#xA;&#xA;use a front end&#xA;&#xA;Yes, again. br/&#xA;Avoid the #cli. And try to make your text editor and your front end as good friends as possible. br/&#xA;&#xA;coding&#xA;&#xA;Format your code properly, otherwise, diffing becomes useless, and your code diffs will be hidden by formatting diffs. Even worst, people you collaborate with will be unable to read your history. Comply to language standards. br/&#xA;&#xA;changes&#xA;&#xA;If possible, ask your text editor to have some kind of visual hints on what you have changed, added or removed. br/&#xA;Learn how to inspect diffs between working copy and staging area, between working copy and last commit, and the contents of a commit. Learn how to discard changes. br/&#xA;&#xA;commits&#xA;&#xA;Commits are lightweight diffs. A commit has one or two parent commits, and is identified by a unique hash. br/&#xA;Stage your changes first, commit them then. Learn how to stage chunks of changes, not all of them. br/&#xA;Remember to commit early, commit often: git is a CVS, not an archival, not a backup system. Never commit binaries (except artifacts: pdf, etc.). br/&#xA;Authentify who authors your developments and gpg-sign your commits. br/&#xA;Group changes in meaningful commits, and remember git history must be read as a novel: write meaningful commit messages. Consider that people spend much more time reading git history than writing it. br/&#xA;&#xA;branches, tags and releases&#xA;&#xA;A branch is a pointer to a commit, and if your remove the pointer to a commit, you won’t be able to access it anymore. Branches are free (as in beer !), so branch as much as your need. br/&#xA;Tags are fix pointers (labels) to commits (aliases) They identify stages, or important hints in development. br/&#xA;Remember to always store your work hash/tag along with your results, you’ll know what you’re doing, you’ll know which version of your submodules you’re using, and you’ll be able to compare your results. br/&#xA;Releases are numbered tags, identifying accomplishments. Be familiar with semantic versioning br/&#xA;Before merging branches, understand the differences between fast-forward (advance the pointer) and non fast-forward (keep branch history in a feature branch). And learn how to resolve merge conflicts with your frontend ! br/&#xA;&#xA;logs&#xA;&#xA;Check frequently where you are in the log history, you may get backwards in history by just moving a pointer. br/&#xA;Learn to search (and filter searches) in the log messages br/&#xA;&#xA;workflows&#xA;&#xA;Remember local is decoupled from remote, and that git doesn’t impose any workflow, so everything is possible. br/&#xA;Learn the advised workflow in collaborative development: gitflow, and consider merge / pull requests are just artificial standards of a #gitforge. br/&#xA;At a minimum, use: br/&#xA;&#xA;    main, stable branch (releases only) br/&#xA;    devel, working branch (commit here) br/&#xA;    feature, topic-specific branch (spin-off) br/&#xA;&#xA;locally&#xA;&#xA;Everything may be fixed while working locally. br/&#xA;Use .gitignore., locally at $GITDIR/info/exclude and at global level at ./.gitignore. For lazy people you have gitignore.io br/&#xA;git-config your environment before anything else, globally at ~/.gitconfig, at project local at $GITDIR/config. br/&#xA;You’ll find more details about all the previous here. br/]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://git.sr.ht/~csantosb/blog.csantosb/blob/master/pics/gitbest.png" alt="img"> <br/>
We said <a href="/csantosb/tag:git" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">git</span></a>, then. How to use git as efficiently as possible in <a href="/csantosb/tag:modernhw" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">modernhw</span></a> ? We know the answer, <a href="https://infosec.press/csantosb/git-ytbn" rel="nofollow">using a front end</a>. Right, but then ? Following a set of simple principles and <a href="https://l2it.pages.in2p3.fr/cad/git-best-practices/" rel="nofollow">best practices</a> that will make your life simpler. Follow me on this trip.  <br/></p>

<h1 id="read-a-couple-of-good-references">read a couple of good references</h1>

<p><a href="https://pragprog.com/titles/tsgit/pragmatic-version-control-using-git/" rel="nofollow">Pragmatic Version Control Using Git</a>, <a href="https://www.oreilly.com/library/view/version-control-with/9781492091189/" rel="nofollow">Version Control with Git, 3rd Edition</a> and <a href="https://github.com/saladinreborn/latihangit/blob/master/Buku%20GIT/Pragmatic%20Guide%20to%20Git.pdf" rel="nofollow">Pragmatic guide to git</a> are good examples, but there are many more around. Use them as a reference and as a starting point, and try to go beyond following your needs. <br/>
Check the official <a href="https://git-scm.com/book/en/v2" rel="nofollow">doc</a>. And remember you have <code>man git-log</code>, <code>man git-config</code>, etc. at your disposal. <br/></p>

<h1 id="use-a-front-end">use a front end</h1>

<p>Yes, again. <br/>
<strong>Avoid the <a href="/csantosb/tag:cli" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">cli</span></a></strong>. And try to make your text editor and your front end as good friends as possible. <br/></p>

<h1 id="coding">coding</h1>

<p>Format your code properly, otherwise, diffing becomes useless, and your code diffs will be hidden by formatting diffs. Even worst, people you collaborate with will be unable to read your history. Comply to language standards. <br/></p>

<h1 id="changes">changes</h1>

<p>If possible, ask your text editor to have some kind of visual hints on what you have changed, added or removed. <br/>
Learn how to inspect diffs between working copy and staging area, between working copy and last commit, and the contents of a commit. Learn how to discard changes. <br/></p>

<h1 id="commits">commits</h1>

<p>Commits are lightweight diffs. A commit has one or two parent commits, and is identified by a unique hash. <br/>
Stage your changes first, commit them then. Learn how to stage chunks of changes, not all of them. <br/>
Remember to commit early, commit often: git is a CVS, not an archival, not a backup system. Never commit binaries (except artifacts: pdf, etc.). <br/>
Authentify who authors your developments and gpg-sign your commits. <br/>
Group changes in meaningful commits, and remember git history must be read as a novel: write meaningful commit messages. Consider that people spend much more time reading git history than writing it. <br/></p>

<h1 id="branches-tags-and-releases">branches, tags and releases</h1>

<p>A branch is a pointer to a commit, and if your remove the pointer to a commit, you won’t be able to access it anymore. Branches are free (as in beer !), so branch as much as your need. <br/>
Tags are fix pointers (labels) to commits (aliases) They identify stages, or important hints in development. <br/>
Remember to always store your work hash/tag along with your results, you’ll know what you’re doing, you’ll know which version of your submodules you’re using, and you’ll be able to compare your results. <br/>
Releases are numbered tags, identifying accomplishments. Be familiar with semantic versioning <br/>
Before merging branches, understand the differences between fast-forward (advance the pointer) and non fast-forward (keep branch history in a feature branch). And learn how to resolve merge conflicts with your frontend ! <br/></p>

<h1 id="logs">logs</h1>

<p>Check frequently where you are in the log history, you may get backwards in history by just moving a pointer. <br/>
Learn to search (and filter searches) in the log messages <br/></p>

<h1 id="workflows">workflows</h1>

<p>Remember local is decoupled from remote, and that git doesn’t impose any workflow, so everything is possible. <br/>
Learn the advised workflow in collaborative development: <a href="https://nvie.com/posts/a-successful-git-branching-model/" rel="nofollow">gitflow</a>, and consider merge / pull requests are just artificial standards of a <a href="/csantosb/tag:gitforge" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">gitforge</span></a>. <br/>
At a minimum, use: <br/></p>

<p>    main, stable branch (releases only) <br/>
    devel, working branch (commit here) <br/>
    feature, topic-specific branch (spin-off) <br/></p>

<h1 id="locally">locally</h1>

<p>Everything may be fixed while working locally. <br/>
Use <a href="https://git-scm.com/docs/gitignore" rel="nofollow">.gitignore.</a>, locally at <code>$GITDIR/info/exclude</code> and at global level at <code>./.gitignore</code>. For lazy people you have <code>gitignore.io</code> <br/>
<a href="https://git-scm.com/docs/git-config/en" rel="nofollow">git-config</a> your environment before anything else, globally at <code>~/.gitconfig</code>, at project local at <code>$GITDIR/config</code>. <br/>
You’ll find more details about all the previous <a href="https://l2it.pages.in2p3.fr/cad/git-best-practices/" rel="nofollow">here</a>. <br/></p>
]]></content:encoded>
      <guid>https://infosec.press/csantosb/git-best-practices</guid>
      <pubDate>Mon, 02 Dec 2024 20:27:56 +0000</pubDate>
    </item>
    <item>
      <title>sourcehut crash course</title>
      <link>https://infosec.press/csantosb/sourcehut-crash-course</link>
      <description>&lt;![CDATA[img br/&#xA;Everything you need to get started with sourcehut, an original and interesting #gitforge . !--more-- br/&#xA;#Sourcehut is organized in independent, closely related services. #Git repositories, #maillists, #wiki pages, #bug trackers, etc. belong to different domains, see below. They cooperate to provide a pleasant and practical experience when doing #modernhw. br/&#xA;Check the official documentation for details in all that follows. br/&#xA;Each user is given a ~alias. Each user’s service will appear under the SERVICE.sr.ht/~user domain, and are accessible in the top panels of the web interface. br/&#xA;Main services are: br/&#xA;&#xA;git&#xA;&#xA;git.sr.ht/~user/project, #git repositories. br/&#xA;There are no groups to combine them. I use dot notation to group my projects git.sr.ht/~user/group1.prj1. br/&#xA;&#xA;builds&#xA;&#xA;builds.sr.ht/~user, task building service, with the list of builds by the user, with user’s recent activity. br/&#xA;builds.sr.ht, similar to the previous. br/&#xA;Builds are trigger by a .build.yml manifest, or by a .build folder folder with up to 4 manifest files, at the root of a project. br/&#xA;It is also possible to automatically submit builds when a patch to a repo with build manifests is sent to a mailing list. This is achieved by appending the project name as a prefix to the subject of the message, for example [PATCH project-name]. br/&#xA;Check doc for details. br/&#xA;&#xA;hub&#xA;&#xA;The main tab, sourcehut, gives access to the hub hub.sr.ht/~user (identical to sr.ht/~user). br/&#xA;The hub displays user’s projects. br/&#xA;Projects are groups of git repositories, #maillists and bug trackers. There may be any of them in a project. br/&#xA;Sourcehut itself is organised as a project here https://sr.ht/~sircmpwn/sourcehut, and may be used as an example. br/&#xA;&#xA;todo&#xA;&#xA;todo.sr.ht/~user, ticket tracking service, with the list of trackers created by the user, with user’s recent activity br/&#xA;todo.sr.ht, similar to the previous br/&#xA;&#xA;man&#xA;&#xA;man.sr.ht/~user/NAME, #wiki service to create documentation, with the wikis created by the user br/&#xA;man.sr.ht, sourcehut documentation br/&#xA;man.sr.ht/builds.sr.ht, builds service documentation br/&#xA;man.sr.ht/hub.sr.ht, hub service documentation, etc. br/&#xA;&#xA;lists&#xA;&#xA;lists.sr.ht/~user/NAME, #email #maillists service, with the list created by the user, with user’s recent activity br/&#xA;lists.sr.ht, lists the user follows, with recent activity br/&#xA;&#xA;Extra services are alse provided: br/&#xA;&#xA;chat&#xA;&#xA;chat.sr.ht, without the user alias, is a paid service. It provides a bouncer to save history of IRC channels while not connected, and may be used from another IRC client. br/&#xA;&#xA;paste.sr.ht&#xA;&#xA;Paste hosting service. br/&#xA;&#xA;srht.site&#xA;&#xA;Once again, the official documentation gives in depth details about the previous. And remember, there is also hut to operate from the #cli. br/]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://git.sr.ht/~csantosb/csbwiki/blob/master/pics/sourcehut.png" alt="img"> <br/>
Everything you need to get started with <a href="https://sr.ht" rel="nofollow">sourcehut</a>, an <a href="https://infosec.press/csantosb/git-forges#sourcehut" rel="nofollow">original and interesting</a> <a href="/csantosb/tag:gitforge" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">gitforge</span></a> .  <br/>
<a href="/csantosb/tag:Sourcehut" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Sourcehut</span></a> is organized in independent, closely related services. <a href="/csantosb/tag:Git" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Git</span></a> repositories, <a href="/csantosb/tag:maillists" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">maillists</span></a>, <a href="/csantosb/tag:wiki" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">wiki</span></a> pages, <a href="/csantosb/tag:bug" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">bug</span></a> trackers, etc. belong to different domains, see below. They cooperate to provide a pleasant and practical experience when doing <a href="/csantosb/tag:modernhw" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">modernhw</span></a>. <br/>
Check the <a href="https://man.sr.ht" rel="nofollow">official documentation</a> for details in all that follows. <br/>
Each user is given a <code>~alias</code>. Each user’s service will appear under the <code>SERVICE.sr.ht/~user</code> domain, and are accessible in the top panels of the web interface. <br/>
Main services are: <br/></p>

<h1 id="git">git</h1>

<p><code>git.sr.ht/~user/project</code>, <a href="/csantosb/tag:git" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">git</span></a> repositories. <br/>
There are no groups to combine them. I use dot notation to group my projects <code>git.sr.ht/~user/group1.prj1</code>. <br/></p>

<h1 id="builds">builds</h1>

<p><code>builds.sr.ht/~user</code>, task building service, with the list of builds by the user, with user’s recent activity. <br/>
<code>builds.sr.ht</code>, similar to the previous. <br/>
Builds are trigger by a <code>.build.yml</code> manifest, or by a <code>.build</code> folder folder with up to 4 manifest files, at the root of a project. <br/>
It is also possible to automatically submit builds when a patch to a repo with build manifests is sent to a mailing list. This is achieved by appending the project name as a prefix to the subject of the message, for example [PATCH project-name]. <br/>
Check <a href="https://man.sr.ht/builds.sr.ht/" rel="nofollow">doc</a> for details. <br/></p>

<h1 id="hub">hub</h1>

<p>The main tab, <code>sourcehut</code>, gives access to the hub <code>hub.sr.ht/~user</code> (identical to <code>sr.ht/~user</code>). <br/>
The hub displays user’s projects. <br/>
Projects are groups of git repositories, <a href="/csantosb/tag:maillists" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">maillists</span></a> and bug trackers. There may be any of them in a project. <br/>
Sourcehut itself is organised as a project here <a href="https://sr.ht/~sircmpwn/sourcehut" rel="nofollow">https://sr.ht/~sircmpwn/sourcehut</a>, and may be used as an example. <br/></p>

<h1 id="todo">todo</h1>

<p><code>todo.sr.ht/~user</code>, ticket tracking service, with the list of trackers created by the user, with user’s recent activity <br/>
<code>todo.sr.ht</code>, similar to the previous <br/></p>

<h1 id="man">man</h1>

<p><code>man.sr.ht/~user/NAME</code>, <a href="/csantosb/tag:wiki" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">wiki</span></a> service to create documentation, with the wikis created by the user <br/>
<code>man.sr.ht</code>, <code>sourcehut</code> documentation <br/>
<code>man.sr.ht/builds.sr.ht</code>, builds service documentation <br/>
<code>man.sr.ht/hub.sr.ht</code>, hub service documentation, etc. <br/></p>

<h1 id="lists">lists</h1>

<p><code>lists.sr.ht/~user/NAME</code>, <a href="/csantosb/tag:email" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">email</span></a> <a href="/csantosb/tag:maillists" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">maillists</span></a> service, with the list created by the user, with user’s recent activity <br/>
<code>lists.sr.ht</code>, lists the user follows, with recent activity <br/></p>

<p><strong>Extra services</strong> are alse provided: <br/></p>

<h1 id="chat">chat</h1>

<p><code>chat.sr.ht</code>, without the user alias, is a paid service. It provides a <a href="https://sourcehut.org/blog/2021-11-29-announcing-the-chat.sr.ht-public-beta/" rel="nofollow">bouncer to save history of IRC channels</a> while not connected, and may be used from another IRC client. <br/></p>

<h1 id="paste-sr-ht">paste.sr.ht</h1>

<p>Paste hosting service. <br/></p>

<h1 id="srht-site">srht.site</h1>

<p>Once again, the <a href="https://man.sr.ht" rel="nofollow">official documentation</a> gives in depth details about the previous. And remember, there is also <a href="https://sr.ht/~emersion/hut/" rel="nofollow">hut</a> to operate from the <a href="/csantosb/tag:cli" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">cli</span></a>. <br/></p>
]]></content:encoded>
      <guid>https://infosec.press/csantosb/sourcehut-crash-course</guid>
      <pubDate>Fri, 29 Nov 2024 14:33:48 +0000</pubDate>
    </item>
    <item>
      <title>git</title>
      <link>https://infosec.press/csantosb/git-ytbn</link>
      <description>&lt;![CDATA[img br/&#xA;Once upon a time, in digital electronics design, we were used to moving huge zip files around including project data, code and all ancillary stuff along with it. We were doing backups, snapshots and versioning our code with help of compressed files. That’s the way it was, I knew that time, and you, young reader, would not believe me if I told you about the whole picture. This is not acceptable anymore. !--more-- br/&#xA;Today we have (well, we already did 20 years ago, but, you know, we were electronic engineers, not coding experts after all) tools to handle the situation. We have control version, we have git, and this more than we need to follow changes in our code (and our documentation, bibliography, etc.). Sure, we need a bit of discipline to use it in meaningful way, writing clear commit messages, committing correctly, creating clean histories, using the right branching model and learning how to use #git in a collaborative way. Following best practices is something that, as for today, should be accessible to any engineer, provided he is using the right tools. br/&#xA;The point here is how to interface git. In my experience, most hardware engineers (but not only) just do basic clone, push and pull, creating linear histories. Simply put, they use git as a backup system, with huge unrelated commits. They use git because they must use git, as anyone else is doing, but without any of the associated benefits. No history read, no diffs, no topic branches, no rebasing, no merging, no nothing. The reason is they’re using the command line interface (#cli) to git. Using git in the command line is fine, provided you’re fluent with clis, with a good shell and its plugins, and you have a very good long term memory. No one remembers how to interactively rebase 10 last commits on top of another branch, squashing history. Full stop. And no one will commit every 30 seconds if it takes one minute. Forget about. This brings to the clone/pull/push/that’s it step slope most people is faced to when they use git. And, unfortunately, this is the end of using git proper. br/&#xA;Now, what to do about ? #modernhw requires using a GUI to manipulate your git repositories. This will provide you with a lot of benefits, among them, a clear overview of where you are in your git history, your current status, and most importantly, where you’re going from this point. Which GUI to use ? Don’t expect an answer from me. The one you feel more comfortable with is the right choice. No matter what, provided it is #freesoftware. Spend as many time as you need mastering its usage, you’ll be rewarded afterward. br/&#xA;Personally, as I’m using #emacs, my not that original choice goes to using #magit. Magit is a front end application to the command line git, closely embedded within the rest of my workflow. As usual, once one gets used to its way of doing things, it’s really fast to perform any git operation in a few seconds. Within a few keystrokes, it is possible to get the status, log, remotes, branches and doing the difference between to different versions. It gives access to complete much more sophisticated manipulations in less time that it takes to tell about. Try to achieve the same using the command line (you will, but it will take ages). The key here is the time it takes: if you need longer to git than what it takes to think about, you’re using git the wrong way. You’ve been advised. br/]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://git.sr.ht/~csantosb/csbwiki/blob/master/pics/git.png" alt="img"> <br/>
Once upon a time, in digital electronics design, we were used to moving huge zip files around including project data, code and all ancillary stuff along with it. We were doing backups, snapshots and versioning our code with help of compressed files. That’s the way it was, I knew that time, and you, young reader, would not believe me if I told you about the whole picture. This is not acceptable anymore.  <br/>
Today we have (well, we already did 20 years ago, but, you know, we were electronic engineers, not coding experts after all) tools to handle the situation. We have control version, we have <a href="https://git-scm.com/" rel="nofollow">git</a>, and this more than we need to follow changes in our code (and our documentation, bibliography, etc.). Sure, we need a bit of discipline to use it in meaningful way, writing clear commit messages, committing correctly, creating clean histories, using the right branching model and learning how to use <a href="/csantosb/tag:git" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">git</span></a> in a collaborative way. Following <a href="https://l2it.pages.in2p3.fr/cad/git-best-practices/" rel="nofollow">best practices</a> is something that, as for today, should be accessible to any engineer, provided he is using the right tools. <br/>
The point here is how to interface git. In my experience, most hardware engineers (but not only) just do basic clone, push and pull, creating linear histories. Simply put, they use git as a backup system, with huge unrelated commits. They use git because they must use git, as anyone else is doing, but without any of the associated benefits. No history read, no diffs, no topic branches, no rebasing, no merging, no nothing. The reason is they’re using the command line interface (<a href="/csantosb/tag:cli" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">cli</span></a>) to git. Using git in the command line is fine, provided you’re fluent with clis, with a good shell and its plugins, and you have a very good long term memory. No one remembers how to interactively rebase 10 last commits on top of another branch, squashing history. Full stop. And no one will commit every 30 seconds if it takes one minute. Forget about. This brings to the clone/pull/push/that’s it step slope most people is faced to when they use git. And, unfortunately, this is the end of using git proper. <br/>
Now, what to do about ? <a href="/csantosb/tag:modernhw" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">modernhw</span></a> requires using a GUI to manipulate your git repositories. This will provide you with a lot of benefits, among them, a clear overview of where you are in your git history, your current status, and most importantly, where you’re going from this point. Which GUI to use ? Don’t expect an answer from me. The one you feel more comfortable with is the right choice. No matter what, provided it is <a href="/csantosb/tag:freesoftware" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">freesoftware</span></a>. Spend as many time as you need mastering its usage, you’ll be rewarded afterward. <br/>
Personally, as I’m using <a href="/csantosb/tag:emacs" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">emacs</span></a>, my not that original choice goes to using <a href="/csantosb/tag:magit" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">magit</span></a>. <a href="https://magit.vc/" rel="nofollow">Magit</a> is a front end application to the command line git, closely embedded within the rest of my workflow. As usual, once one gets used to its way of doing things, it’s really fast to perform any git operation in a few seconds. Within a few keystrokes, it is possible to get the status, log, remotes, branches and doing the difference between to different versions. It gives access to complete much more sophisticated manipulations in less time that it takes to tell about. Try to achieve the same using the command line (you will, but it will take ages). The key here is the time it takes: if you need longer to git than what it takes to think about, you’re using git the wrong way. You’ve been advised. <br/></p>
]]></content:encoded>
      <guid>https://infosec.press/csantosb/git-ytbn</guid>
      <pubDate>Tue, 31 Jan 2023 23:00:00 +0000</pubDate>
    </item>
  </channel>
</rss>